- 查询优化的常用策略
- 优化数据访问(缓存、只查询需要显示的列等)
- 重写SQL(避免连接太多表)
- 重新设计库表
- 添加索引
- 连接的优化
- on、using子句中的列确认有索引。
- 最好是能转化为inner join、left join的成本比inner join高很多。
- 使用explain检查连接,留意其输出的rows列,若rows列太高,比如几千,上万,则需考虑是否索引不佳或连接表的顺序不当。
- 反范式设计,可减少连接表的个数,加快存取数据的速度。
- 考虑在应用层实现连接。
- 一些可能需要访问不同的数据库实例,这种情况下,在应用层实现连接将是更好的选择。
- group by 、distinct、order by语句优化
- 尽量对较少的列进行排序。
- 如果连接了多张表,order by 的列应该属于连接顺序的第一张表。
- 利用索引排序,若不能利用索引排序,那explain查询语句将会看到有filesort。
- group by、order by 语句参考的列应该尽量在一个表中。
- 需要保证索引列和order by 列相同,且各列均按相同的方向进行排序。
- 增加sort_buffer_size(为每个排序线程分配的缓冲区的大小)。
- 增加read_rnd_buffer_size(可改进order by性能)。
- 改变tmpdir变量指向基于内存的文件系统或其他更快的磁盘。
- 指定order by null(默认情况下,MySQL会排序所有 group by