mysql查询优化细节汇总
Contents
总则
mysql的优化思路
- 开启long query和log_queries_not_using_indexes的日志,帮助定位问题。
- 查看执行计划是否建立和走了正确的索引,以及索引的优化,联合索引引用的长度
- 海量数据的话,就要结合业务考虑表的存储引擎、缓存查询、分区(水平和垂直分区)、分表、读写分离、集群
索引的优化
- 联合索引应该把区分度更大的字段放前面,效果更好
- Innodb 不建议使用过长的字段作为主键,因为是聚集式索引,其他索引会存储不压缩的主键
- 最左匹配原则有2个含义:like匹配通配符不能在前面、联合索引顺序也是按照从左到右的顺序
- 索引字段 查询条件中含有函数或表达式,索引无效:比如 emp_no -1=3, left(title,6)=‘huangz’
- 少基数的字段不建议使用索引,性能提升不明显,同时要DML的时候要维护索引,空间和性能上浪费。比如男女字段,比例大约1:1,提升不明显,如果男女比率 1000:1,那么查询女的用户的时候,性能提升明显。
- mysql一次查询只能使用一个索引。如果要对多个字段使用索引,建立复合索引。
- 删除不再使用的索引
- 字符串使用短索引,可以提高查询速度和节省磁盘空间和I/O操作
SQL优化
- 为了利用索引,where条件不要用函数或者做计算, 例如 where emp_no -1>20;
慢查询、非索引查询实现
|