Contents
  1. 1. 总则
  2. 2. 索引的优化
  3. 3. SQL优化
  4. 4. 慢查询、非索引查询实现

总则

mysql的优化思路

  1. 开启long query和log_queries_not_using_indexes的日志,帮助定位问题。
  2. 查看执行计划是否建立和走了正确的索引,以及索引的优化,联合索引引用的长度
  3. 海量数据的话,就要结合业务考虑表的存储引擎、缓存查询、分区(水平和垂直分区)、分表、读写分离、集群

索引的优化

  • 联合索引应该把区分度更大的字段放前面,效果更好
  • 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;

慢查询、非索引查询实现

show variables like '%quer%';
查看 slow_query_log 是否开启,和超时记录的时间。
set GLOBAL slow_query_log='ON';
set GLOBAL long_query_time=2; #要重新打开连接才会生效
select sleep(3);
show variables like '%log_output%'; #查看输出日志的格式是 log日志 还是表数据
show global status like '%slow%'; 所有慢查询的次数
# 设置表数据存储慢查询
set global log_output='FILE,TABLE';
select * from mysql.slow_log;
Contents
  1. 1. 总则
  2. 2. 索引的优化
  3. 3. SQL优化
  4. 4. 慢查询、非索引查询实现