Mysql
 sql >> база данни >  >> RDS >> Mysql

Правилно индексиране от Join-Where-Group Чрез избиране на заявки, избягване на Използване на временен; Използване на сортиране на файлове

Бих написал заявката така:

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 реда няма да видим значителна разлика в производителността (изминало време) между оптимален план за изпълнение и ужасен план за изпълнение.

Когато някоя от таблиците се мащабира до милиони редове, тогава разликите ще станат очевидни. Изборът на план за изпълнение на оптимизаторите се влияе от статистическите данни (размер, брой редове, мощност на колони) на всяка таблица, така че планът за изпълнение може да се промени с увеличаване на размерите на таблицата.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL 5.7.5+ получава първия ред за групите

  2. Как да стартирам Spring-Boot приложение, без да зависи от базата данни?

  3. Проблем с събирането, възможно ли е да се понижи/преобразува от utf8mb4_unicode_ci в utf8_general_ci?

  4. Защо моят PDO не работи?

  5. Конфигурация на Nginx с Magento 1.8