遇到一个SQL执行很慢 SQL 如下:
SELECT
...
FROM
tableA
WHERE time >= 1492044535 and time <= 1492046335 GROUP by time, sourceName, serverSite,clientSite;
SELECT 部分忽略没写,是因为通常SQL执行慢不会跟这部分有关系,至少我没见过。
该语句非常简单,但是执行太慢。所以我们看一下执行计划
执行计划有几个字段我们比较关注:
type:range
possible_keys:time
key:time
extra:using index condition; using temporary; using filesort
type 代表连接类型。range是索引范围扫描的时候显示的类型。
possible_keys 和 keys 是可用的索引以及实际的索引
extra 比较关键,我们详细看一下这里的信息:
filesort
是说在排序的时候,没办法使用索引。比如我们这里用的索引是time,但group by 是 time, sourceName, serverSite,clientSite。Mysql有一点很重要是会默认按照group by排序。
group by time, sourceName, serverSite, clientSite
和
order by time, sourceName, serverSite, clientSite
开销其实区别不大。所以这里排序不但要按照time 还要按照其它几列