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'
测试题目: