我会这样写查询:
SELECT c.time
, SUM(c.counter)
, MAX(p.clustername) AS clustername
FROM cell c
JOIN swap_plan p
ON p.siteid = c.siteid
AND p.clustername = 'Cluster A'
WHERE c.time >= 'day1'
AND c.time <= 'day2'
GROUP
BY c.time
我肯定有一个索引cell
with time
作为主导柱。
MySQL 可以使用相同的索引来满足范围谓词(在 WHERE 子句中),并且无需“使用文件排序”操作即可满足 GROUP BY。
... ON cell (time)
根据列的大小,覆盖索引可能会提供最佳性能。覆盖索引包括查询中引用的表中的所有列,因此可以完全从索引页满足查询,而无需查找基础表中的页。
... ON cell (time, siteid, counter)
对于索引swap_plan
,我有一个索引site_id
作为主导柱,并包括clustername
列,其中之一:
... ON swap_plan (clustername, site_id)
or
... ON swap_plan (site_id, clustername)
看起来这两列的组合可能会有一个唯一的约束,即site_id
对于给定的情况将是不同的clustername
。 (如果不是这样的话,同样(site_id,clustername)
元组出现多次,有可能总计counter
被充气。
我正在寻找EXPLAIN
输出显示“ref”查找swap_plan
表中的值c.siteid
以及 clustername 的 const(字面值“Cluster A”)值。
对于大小为 31 行和 368 行的表,我们不会看到最佳执行计划和糟糕的执行计划之间的性能(经过的时间)存在显着差异。
当任一表扩展到数百万行时,差异就会变得明显。优化器对执行计划的选择受到每个表的统计信息(大小、行数、列基数)的影响,因此执行计划可能会随着表大小的增加而改变。