SQL优化

▼魔方 西西 提交于 2019-12-06 10:58:46
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 ...
 
避免索引失效
  1. in可能造成索引失效,避免使用in或将in条件放置最后【where name = 'zs' and age in(23,25)】
  2. 复合索引使用顺序和创建顺序一致且不跨列使用(最佳左前缀)
  3. 复合索引经量全索引匹配(a、b、c全都用上)
  4. 避免在索引上进行操作(计算、函数、类型转换...)
  5. 复合索引比避免进行不等式判断(!=、<>)、或null判断(is null、is not null)
  6. like经量以常量开头,避免以%开头
  7. 避免使用or
多表查询
  1. (数据量)小表驱动大表【where 小表.tid = 大表.tid(左小右大)】
  2. 索引建立在经常使用的字段上【左连接给左表加索引,右连接给右边加索引】
 
优化方法:

  1.如果主查询数据量大使用in,如果子查询数据量大使用exists

  2.order by优化

  1. using filesort有两种算法:单路排序、双路排序(根据io次数判断)
    1. MYSQL4.1之前 默认采用双路排序(1、从磁盘中读取排序字段,在buffer缓冲区中进行排序 2、扫描其他字段)
    2. MYSQL4.1之后 默认采用单路排序(一次读取全部字段,在buffer中进行排序)
    3. 修改buffer容量大小【set max_length_for_sort_data = 1024 单位byte】
    4. 如果buffer太低,会自动切换为双路
  2. 可以选择排序算法,设置buffer大小
  3. 保证排序字段排序一致(同升同降)
  4. 避免select *

  3.SQL排查--慢查询日志:用于记录响应时间超过阀值的sql语句(long_query_time,默认10秒)【默认关闭】

  1. 查询是否开启:show variables like "%slow_query_log%";
  2. 临时开启:set global slow_query_log = 1;
  3. 查询慢日志阀值:show variables like "%long_query_time%";
  4. 临时修改阀值:set global long_query_time = 5; (重新登录后生效)
  5. 查询超过阀值的SQL:show global status like '%slow_queries%' ;
    1. s:排序方式  
    2. r:逆序
    3. l:锁定时间
    4. g:正则匹配模式
    5. .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服务

       

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!