Mysql SQL优化

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优化有诀窍

听着还挺带劲

最后附上习题一部,不发答案,大家自己瞅瞅,可以答案写评论区,我是全猜对了,你呢

Mysql SQL优化

 

 

作者:彼岸舞

时间:2020\07\11

内容关于:Mysql

本文来源于网络,只做技术分享,一概不负任何责任

Mysql SQL优化

上一篇:mysql新建用户,修改权限


下一篇:ORACLE表分区PARTITION、SUBPARTITION和INTERVAL的使用