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

Съставният индекс има ли посока в MySQL?

Когато искате максималната скорост на извличане и имате и двете колони в условията за свързване или където, НО понякога колона a има по-висока селективност, а понякога колона b има по-висока селективност и искате да се възползвате от този факт от единичен индекс.

Също така мисля, че вашето съотношение размер на данни / производителност на машината трябва да е доста високо и в същото време ще трябва (предполагайки) да сте готови да наречете всяко подобрение необходимост (дори и само с няколко процента).

Все пак опитът учи, че нещата зависят от много фактори; със специфични RDBMS и среди на приложения, по-добре е да изпълнявате свои собствени бенчмаркове.

РЕДАКТИРАНЕ:Допълнително обяснение относно съставните индекси.от wikipedia :
"Редът, в който колоните са изброени в дефиницията на индекса, е важен. Възможно е да се извлече набор от идентификатори на редове, използвайки само първата индексирана колона. Това обаче не е възможно или ефективно (на повечето бази данни), за да извлечете набора от идентификатори на редове, използвайки само втората или по-голяма индексирана колона.
Например, представете си телефонен указател, който е организиран първо по град, след това по фамилия и след това по собствено име. Ако ако им е даден град, можете лесно да извлечете списъка с всички телефонни номера за този град. Въпреки това, в този телефонен указател би било много досадно да намерите всички телефонни номера за дадено фамилно име. Ще трябва да търсите във всеки град раздел за вписванията с това фамилно име."

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

В зависимост от размера на индекса спрямо размера на структурата от данни спрямо наличната памет срещу селективността на първата колона на индекса все пак може да е много по-евтино да се използва грешно подреден индекс, отколкото да се използва сканиране на таблици.

А, просто се сетих за по-добра аналогия с пример, който търсите. Представете си хубав учебник, той ще има съдържание с глави и подглави и номер на страниците, на които се намират (което е неклъстериран индекс, който съдържа указатели към записи на данни - страници). Сега си представете, че учебникът е по стандарта SQL-92, тогава повечето термини в TOC ще бъдат SQL термини (придържайте се към това предположение). Вие също ще имате друг индекс в края на книгата, който ще избройте всички интересни термини в азбучен ред (да предположим с имената на основните глави) и номера на страници.

За въпроси като „Кажи ми всички глави, под които се появява DISTINCT“, ще използвате втория индекс. (тъй като селективността на следващото поле е висока)

За въпроси като „Кажете ми броя на термините, които се появяват в първата глава“, бихте използвали TOC

Така че за въпроси като "SELECT описано ли е в DML глава?" може да използвате някой от индексите. (тъй като селективността и на двете полета е висока) Но ако TOC на самия DML е дълъг 3 страници и записът SELECT в индекса има само петнадесет реда, вероятно ще отидете на второто, а това е пример за това, когато се възползвате от двата индекса.

Сега, ако смятате, че това е твърде далеч, вземете под внимание база данни от сканираната библиотека на Конгреса. :)

Както казах преди, цялото планиране е наред, но в крайна сметка изпълнете свои собствени показатели.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да подобрим ефективността на заявката с подреждане по, групиране по и присъединяване

  2. Извличането на PDO не връща нищо

  3. Комбинирайте две колони в една колона

  4. MySQL Дублиращи се редове

  5. Съединяване на таблици от различни бази данни