MYSQL--性能调优

122 阅读2分钟

性能调优

如何看一个SQL语句是否走了索引?

  • 可以通过explatin来查看这条SQL语句的执行计划,主要字段包括TYPE(扫描类型)、POSSIBLE_KEYS(可能的索引)、KEY(实际索引)、KEY_LEN(索引长度)、ROWS(扫描的数据行)
  • 主要看TYPE 当前的扫描类型:

    • ALL 全表扫描
    • INDEX 全索引扫描
    • RANGE 范围索引扫描
    • REF 非唯一索引扫描
    • EQ_REF 唯一索引扫描
    • CONST 主键索引或者唯一索引扫描

EXTRA 字段

  • USING INDEX 覆盖索引
  • USING WHERE 将查询结果返回到service进行过滤,USING WHERE 不一定回表
  • USING INDEX CONDITION 在索引层进行数据过滤,不用取出数据再返回service层了

怎么找到慢SQL

再SQL的配置文件中设置为3s

slow_query_log = 3
slow_query_log_file = /path/to/slow_query.log
long_query_time = 3

如何优化慢SQL

  • 优化数据访问,是否有不必要的列(不用*),是否查询的列太多,加limit
  • 切分查询,把大查询分段查询,每次只查一小部分,最后组合
  • 分解联表查询
  • 覆盖索引,并检查是否会出现索引失效,排序优化

如果SQL语句都没问题,怎么优化?

  • 短平快的数据走REDIS旁路缓存
  • 分批查询
  • 分段查询
  • 读多写少的用主从复制
  • 合理分库

深分页查询如何优化?

  • 深分页场景:SELECT ..... LIMIT 1000000 20

    • 这种场景,从100万开始查,但返回20条,时间复杂度高,如果回表,前一百万条也要进行回表
  • 场景优化

    • 记录上一次最后的id WHERE ID>xl来查询
    • 覆盖索引+子查询,先查询出来二级索引需要的主键值,然后用主键值去查主键索引