MySQL 调优

48 阅读2分钟

优化表结构

  • 第一范式:确保每个字段原子性,不能在被拆分。
  • 第二范式:确保每条记录都有主键,所有非主键字段必须完全依赖主键。
  • 第三范式:确保非主键之间是互相独立,不能产生依赖。
  • 第四范式:一个表中只有一对(1:多)的关系。

优化逻辑查询

子查询优化

  • 子查询执行效率不高,使用关联查询(join)代替子查询。
  • 效率不高的原因:查询的过程中需要建立一个临时表,查询完毕,再撤销临时表,临时表都不会使用索引。

排序优化

  • index 排序:b+树的叶子节点就是按照排序进行的,使用索引直接就可以保证有序性。
  • fileSort 排序:将需要排序的数据加载到内存中,然后进行排序。
  • 尽量使用索引完成 order by 排序。如果 where 和 order by 后面的列相同就用单索引,不同就用联合索引。

group by优化

  • group by 优化的方法和 order by 一样。

分页查询优化

  • 通过子查询先查出来 ID 值,再通过 ID 值查询最终完整数据,减少回表次数。
  • 记录上一页最后一条 ID 值,下一页从这个 ID 值开始查询。

关于select *

  • 尽量按需加载,不要使用select *。

索引调优

  • 使用索引覆盖、索引下推,减少回表次数。
  • 联合索引最左原则匹配。
  • 避免 or 查询。
  • 避免 like 开头模糊匹配。
  • 避免类型转换。
  • 避免 where 中索引列有运算。
  • 避免 where 中索引列使用了函数(not in 或 not exists)。
  • 如果 MySQL 觉得全表扫描更快时索引也会失效。

大表优化

  • 主从复制,读写分离。
  • 分库分表。
  • mycat、shardingjdbc。