sq编写过程:
select dinstinct ..from ..join ..on ..where ..group by ...having ..order by ..limit ..
sql解析过程:
from .. on.. join ..where ..group by ....having ...select dinstinct ..order by limit ...
避免索引失效
- in可能造成索引失效,避免使用in或将in条件放置最后【where name = 'zs' and age in(23,25)】
- 复合索引使用顺序和创建顺序一致且不跨列使用(最佳左前缀)
- 复合索引经量全索引匹配(a、b、c全都用上)
- 避免在索引上进行操作(计算、函数、类型转换...)
- 复合索引比避免进行不等式判断(!=、<>)、或null判断(is null、is not null)
- like经量以常量开头,避免以%开头
- 避免使用or
多表查询
- (数据量)小表驱动大表【where 小表.tid = 大表.tid(左小右大)】
- 索引建立在经常使用的字段上【左连接给左表加索引,右连接给右边加索引】
优化方法:
1.如果主查询数据量大使用in,如果子查询数据量大使用exists
2.order by优化
- using filesort有两种算法:单路排序、双路排序(根据io次数判断)
- MYSQL4.1之前 默认采用双路排序(1、从磁盘中读取排序字段,在buffer缓冲区中进行排序 2、扫描其他字段)
- MYSQL4.1之后 默认采用单路排序(一次读取全部字段,在buffer中进行排序)
- 修改buffer容量大小【set max_length_for_sort_data = 1024 单位byte】
- 如果buffer太低,会自动切换为双路
- 可以选择排序算法,设置buffer大小
- 保证排序字段排序一致(同升同降)
- 避免select *
3.SQL排查--慢查询日志:用于记录响应时间超过阀值的sql语句(long_query_time,默认10秒)【默认关闭】
- 查询是否开启:show variables like "%slow_query_log%";
- 临时开启:set global slow_query_log = 1;
- 查询慢日志阀值:show variables like "%long_query_time%";
- 临时修改阀值:set global long_query_time = 5; (重新登录后生效)
- 查询超过阀值的SQL:show global status like '%slow_queries%' ;
- s:排序方式
- r:逆序
- l:锁定时间
- g:正则匹配模式
- .mysqldumpslow工具
1 慢日志永久设置: 2 vim /etc/my.cnf 3 [mysqld] 4 slow_query_log=1//永久开启慢日志 5 slow_query_log_file=/var/lib/mysql/localhost-slow.log//指定日志文件 6 long_query_time=5//设置阀值 7 ***************************************** 8 service mysql restart//重启mysql服务