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

MySQL индекс за групиране по / поръчка по

Това трябва да ви помогне. Пренапишете заявката си, както следва:

SELECT c1, Sum(c2) 
FROM table 
WHERE c4 = 2011 
AND c5 = 0 
AND c6 In (6,9,11)
AND c3 IS NOT NULL   
GROUP BY c1

Сега създайте съставен индекс на колони (c4, c5, c6) с колоните В ТОЗИ ПОРЪД. Колоните във вашия индекс трябва да се показват в същия ред като колоните във вашата клауза WHERE. В противен случай индексът няма да работи. Селективността на този индекс е достатъчно тясна, че сортирането на файлове във временната таблица (за групата по) трябва да бъде бързо.

Причината да преместите c3 в края на заявката е следната. Като пример, нека приемем, че c3 може да приема стойности между 0 и 100 (или може да бъде NULL). Ако изпълните заявка "IS NOT NULL", тогава Mysql трябва да премине почти през целия индекс на B-Tree с изключение на ръбовете, които отговарят на NULL. Следователно MySQL решава, че пълното сканиране на таблицата е по-лесна опция, отколкото преминаването през всички различни пътища в индекса. От друга страна, ще видите, че ако вашата заявка е "IS NULL" и вашият индекс е (c3, c4, c5, c6), тогава Mysql всъщност ще използва този индекс. Това е така, защото в този случай Mysql трябва само да премине през частта от индексното дърво, съответстваща на стойността NULL.

Видът индекси, от които се нуждае MySQL, много зависи от въпросната заявка. Създаването на индекси за всички колони, както предложи @louis, НЕ е добра идея!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разберете къде се забавя вашият PHP код (проблем с производителността)

  2. MySQL таблица с колона TEXT

  3. Актуализирайте с присъединяване с помощта на Zend-framework

  4. Изявление на mySQL If

  5. Грешка Keyerror 255 при изпълнение на pymysql.connect