一、子查询优化
子查询可以通过一个SQL语句实现比较复杂的查询。但是子查询的效率不高。原因在于
- 执行子查询时,MySQL为内层查询语句的结果建立一个临时表,在查询结束后,会撤销这些临时表。这就导致消耗过多的CPU和IO资源,产生大量的慢查询。
- 子查询产生的临时表不会存在索引,索引查询性能较低。
二、排序优化
在MySQL中支持两种排序方式,分别是FileSort
和IndexSort
。
Index
排序中,索引可以保证数据的有序性,不需要再进行排序,效率更高。FileSort
排序一般在内存中进行,占用CPU较多。且如果待排结果过大,会产生临时文件I/O到磁盘进行排序的情况,效率较低。
在SQL中使用索引到WHERE
以及GROUP BY
中的目的是,避免在WHERE
子句中进行全表扫描,且避免OEDER BY
排序进行FileSort
排序。
但并不是所有的FileSort
排序的执行效率都低于Index
,原因在于所有的排序都是在条件过滤之后执行的,如果过滤了大部分数据后只剩下几百几千条数据,那么Index
也无法进行显著的提升。
2.1、filesort算法:双路排序和单路排序
当要排序的字段不在索引列上时,filesort有两种算法:双路