MySQL基础学习笔记——数据库优化(2):SQL查询优化

Wesley13
• 阅读 686

数据库优化

SQL查询优化

  1. 避免全表扫描,应该考虑在whereorder by涉及的列上建立索引

  2. 查询时使用select明确指明所要查询的字段,避免使用select *keys *flushdb等)的操作;

  3. SQL语句尽量大写,如:

    SELECT name FROM t WHERE id=1;

  • 对于小写的SQL语句,通常数据在解析SQL语句时,通常会先转化成大写再执行。
  1. 尽量避免where子句中使用!=<>操作符,MySQL只有对以下操作符才使用索引<<==>>=BETWEENIN,以及某些时候的LIKE

    SELECT id FROM t WHERE name LIKE 'abc%';

  2. 对于模糊查询,

    SELECT id FROM t WHERE name LIKE '%abc%'; // 或者 SELECT id FROM t WHERE name LIKE '%abc'

将导致全表扫描,应避免使用,若要提高效率,可以考虑全文检索;

  1. 遵循最左原则,在where子句中写查询条件时把索引字段放在前面,如:

    // mobile为索引字段,name为非索引字段 // 推荐 SELECT ... FROM t WHERE mobile='1391111111' AND name='gyhs'; // 不推荐 SELECT ... FROM t WHERE name='gyhs' AND mobile='13911111111';

    // 建立了复合索引key(a, b, c) // 推荐 SELECT ... FROM t WHERE a=... AND b=... AND c=... SELECT ... FROM t WHERE a=... AND b=... SELECT ... FROM t WHERE a=... // 不推荐 SELECT ... FROM t WHERE b=... AND c=... SELECT ... FROM t WHERE b=... AND a=... AND c=... ...

  2. 能使用关联查询解决的尽量不要使用子查询,如:

    // 子查询 SELECT article_id, title FROM t_article WHERE user_id IN (SELECT user_id FROM t_user WHERE user_name IN('yangmi','tanyan','dilireba')) // 关联查询(推荐) SELECT b.article_id, b.title FROM t_user AS a INNER JOIN t_article AS b ON a.user_id=b.user_id WHERE a.user_name IN ('yangmi', 'tangyan', 'dilierba')

能不使用关联查询的尽量不要使用关联查询

  1. 不需要获取全表数据的时候,不要查询全表数据,使用LIMIT来限制数据。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Kevin501 Kevin501
3年前
常见SQL编写和优化
常见的SQL优化方式1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2.应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:selectidfromtwherenumisnul
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql5.6 分页查询优化
mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这