Бих написал заявката така:
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 с time като водеща колона.
MySQL може да използва същия индекс, за да удовлетвори предиката на диапазона (в клаузата WHERE) и да удовлетвори GROUP BY без операция „Използване на сортиране на файлове“.
... ON cell (time)
В зависимост от размерите на колоните, индексът на покриване може да даде оптимална производителност. Покриващ индекс включва всички колони от таблицата, които са посочени в заявката, така че заявката може да бъде удовлетворена изцяло от индексни страници, без да се търси страници в основната таблица.
... ON cell (time, siteid, counter)
За индекса на swap_plan , ще имам индекс с site_id като водеща колона, включително clustername колона, едно от следните:
... ON swap_plan (clustername, site_id)
или
... ON swap_plan (site_id, clustername)
Изглежда вероятно ще има УНИКАЛНО ограничение за комбинацията от тези две колони, т.е. стойностите на site_id ще бъде различен за даден clustername . (Ако това не е така, и същият (site_id,clustername) кортежът се появява няколко пъти, има потенциал за агрегирана обща сума от counter да се надуе.
Ще търся EXPLAIN изход за показване на справка за търсене на swap_plan таблица от стойността на c.siteid и const (буквално „Клъстер А“) стойност за име на клъстер.
С таблици с размери 31 и 368 реда няма да видим значителна разлика в производителността (изминало време) между оптимален план за изпълнение и ужасен план за изпълнение.
Когато някоя от таблиците се мащабира до милиони редове, тогава разликите ще станат очевидни. Изборът на план за изпълнение на оптимизаторите се влияе от статистическите данни (размер, брой редове, мощност на колони) на всяка таблица, така че планът за изпълнение може да се промени с увеличаване на размерите на таблицата.