SQL优化规则
第一条:
尽量全值匹配,也就是说尽量使用等于
第二条:
最佳左前缀原则
如果是复合索引,要遵守最佳左前缀原则,指的是从最左侧列开始并且不跳过索引中的列
如果是按顺序使用的索引列,且有最左侧的列,索引列完全有效
如果使用了最左侧的列中间跳过第二列或其他列接着使用,一旦跳过,之后的列索引不生效,俗称部分失效
如果没有使用最左侧的列,索引完全失效
第三条:
不在索引列上做任何操作
不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
第四条:
范围条件放在最后
中间有范围查询会导致后面的索引列全部失效,但是本身是有效的
第五条:
尽量使用覆盖索引
尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
第六条:
尽量不使用不等于
mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描
当然,如果使用了覆盖索引,索引还是可以用的,如果一定要使用不等于,尽量使用覆盖索引
第七条:
Null/Not Null有影响
注意null/not null对索引的可能影响
在字段为not null的情况下,使用is null 或 is not null 会导致索引失效
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name is not null
在字段为null或者未定义的情况下
Is not null 的情况会导致索引失效
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name is not null
第八条:
使用like的注意事项
like以通配符开头(‘%abc...‘)mysql索引失效会变成全表扫描的操作
解决方式:覆盖索引
EXPLAIN select name,age,pos from staffs where name like ‘%july%‘
第九条:
字符串类型加引号
字符串不加单引号索引失效
解决方式:请加引号【捂脸】
第十条:
OR改 UNION效率高
这个SQL还是贴出来吧,不然难理解
EXPLAIN
select * from staffs where name=‘July‘ or name = ‘z3‘
EXPLAIN
select * from staffs where name=‘July‘
UNION
select * from staffs where name = ‘z3‘
解决方式:覆盖索引
EXPLAIN
select name,age from staffs where name=‘July‘ or name = ‘z3‘
总共十条,居然还有人写成了诗,墙都不扶,就服你
全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
LIKE百分写最右,覆盖索引不写*
不等空值还有OR,,索引影响要注意
字符引号不能丢,SQL优化有诀窍
听着还挺带劲
最后附上习题一部,不发答案,大家自己瞅瞅,可以答案写评论区,我是全猜对了,你呢
作者:彼岸舞
时间:2020\07\11
内容关于:Mysql
本文来源于网络,只做技术分享,一概不负任何责任