1. MySQL优化原则

1.1. 避免使用select *

1.2. 查询单条记录结果加上limit 1

select name where id=1 limit 1;

1.3. 索引字段不为空

1.4. 经常查询条件添加索引。

1.5. join关系查询字段加索引,类型编码保持一致。

1.6. 尽量使用not null, null并不代表是空值,null会占空间,空值不会。

1.7. 拆分大的delete和update语句(加入limit限制分批操作)。操作这些语句会锁表。

1.8. 尽量全值匹配. 使用=号匹配具体值。

1.9. 组合索引,遵循最左匹配。

1.10. 查询从索引的最左前列开始并且不跳过索引中的列。

1.11. 不在索引列上做任何操作,会导致索引失效,进行全表扫描。

EXPLAIN SELECT * FROM staffs WHERE left(NAME,4) = 'July';

1.12. 范围条件放最后。

中间有范围查询会导致后面的索引列全部失效,在创建表索引时考虑哪些字段需要范围查询。

1.13. 覆盖索引尽量用

查询列与索引列一致,减少使用select *

1.14. 不等于要甚用

mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描,如果一定要用则使用覆盖索引。

EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME != 'July';
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME <> 'July';

1.15. NULL/NOT有影响

注意null/not null对索引的可能影响。

在字段是not null情况下,where条件中使用is null或者not null会使用索引失效。

在字段是null情况下,where条件中is null有效,使用is not null会使用索引失效。

两种情况都可以使用覆盖索引解决。

1.16. Like查询要当心

like '%abc' 匹配符开头会导致索引失效,查询变成全表扫描。

解决办法:覆盖索引或者不要以匹配符开头或者全值匹配。

1.17. 字符类型加引号

字符不加引号,会发生类型转换,索引会失效。

1.18. or改union效率高


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'

测试题目:

Copyright © 神都花已开 2021 all right reserved,powered by Gitbook修订时间: 2021-11-01 15:05:12

results matching ""

    No results matching ""