MySQL 调优
优化表结构
- 第一范式:确保每个字段原子性,不能在被拆分。
- 第二范式:确保每条记录都有主键,所有非主键字段必须完全依赖主键。
- 第三范式:确保非主键之间是互相独立,不能产生依赖。
- 第四范式:一个表中只有一对(1:多)的关系。
优化逻辑查询
子查询优化
- 子查询执行效率不高,使用关联查询(join)代替子查询。
- 效率不高的原因:查询的过程中需要建立一个临时表,查询完毕,再撤销临时表,临时表都不会使用索引。
排序优化
- index 排序:b+树的叶子节点就是按照排序进行的,使用索引直接就可以保证有序性。
- fileSort 排序:将需要排序的数据加载到内存中,然后进行排序。
- 尽量使用索引完成 order by 排序。如果 where 和 order by 后面的列相同就用单索引,不同就用联合索引。
group by优化
- group by 优化的方法和 order by 一样。
分页查询优化
- 通过子查询先查出来 ID 值,再通过 ID 值查询最终完整数据,减少回表次数。
- 记录上一页最后一条 ID 值,下一页从这个 ID 值开始查询。
关于select *
索引调优
- 使用索引覆盖、索引下推,减少回表次数。
- 联合索引最左原则匹配。
- 避免 or 查询。
- 避免 like 开头模糊匹配。
- 避免类型转换。
- 避免 where 中索引列有运算。
- 避免 where 中索引列使用了函数(not in 或 not exists)。
- 如果 MySQL 觉得全表扫描更快时索引也会失效。
大表优化
- 主从复制,读写分离。
- 分库分表。
- mycat、shardingjdbc。