Чи потрібно мені додати новий індекс одного стовпця до таблиці, якщо індекс з декількома стовпцями у цьому полі вже існує?


10

У мене таблиця з UNIQUEіндексом багато стовпців на _job_id__і __keyword_id__.

Чи потрібно мені також додати інший індекс, __job_id__якщо у мене є часті запити, які виконуються GROUP BYна цьому стовпці?

(у 100 мільйонів рядків це може зайняти деякий час. Ось чому я прошу, а не просто робити)


Якщо ваше справжнє запитання стосується повільного запиту, то вкажіть, будь ласка, ПОКАЗУЙТЕ СТВОРИТИ ТАБЛИЦЮ ПОКАЗУВАННЯ СТАТУСИ ТАБЛИЧНОГО ПОКАЗУВАННЯ ВАРІАБЛІЙ, ПОДІБНУЮТЬ «% буфер%» ПОЯСНІТЬ ВИБІР ... Скільки оперативної пам’яті доступно? Існує багато можливих причин; більшість можна помітити, переглядаючи ці предмети.
Рік Джеймс

Відповіді:


5

Ні, зовсім ні !!! Оптимізатор запитів MySQL зробить правильно, якщо головний стовпець (и), що потрібний, знаходиться в лівій частині індексу. Якщо ви зробили такий індекс, оптимізатор запитів MySQL може вирішити ніколи не використовувати цей індекс, якщо ви завжди виконуєте GROUP BY job_id, ключовий_кідок. Оптимізатор запитів MySQL може або не може використовувати індекс, якщо ви збираєте записи лише за допомогою task_id, але тоді ви все одно маєте зайвий індекс.

Якщо таблиця - MyISAM, виготовлення такого індексу просто роздує файл MYI.

Якщо таблиця InnoDB, а innodb_file_per_table дорівнює 0, то такий індекс просто роздує ibdata1.

Якщо таблиця InnoDB, а innodb_file_per_table дорівнює 1, то такий індекс просто роздує файл .ibd таблиці.

Підсумовуючи це, вам не потрібно робити цей додатковий індекс !!!


Ти впевнений? Цей хлопець пропонує інакше: stackoverflow.com/questions/179085/… чи це відрізняється від MySQL до MSSQL?
Тадей

4

Індекси можуть прискорити group byоперації лише шляхом зменшення сортування - це буде ефективніше, якщо індекс, який використовується, є кластерним індексом або, принаймні, має той самий провідний стовпчик, що і кластерний індекс. В усьому цьому я припускаю, що MySQL не має еквівалента hash group byоперації, яка зазвичай взагалі обійде будь-яку користь індексів - можливо, хтось інший може це підтвердити.

Існує гранична вигода від наявності окремого індексу, job_idякщо вважати, що це єдиний стовпець у group byпункті, а також не є кластеризованим індексом: індекс буде меншим, і тому сканування буде генерувати менше вводу / виводу

--EDIT--

Оскільки індекс містить усі поля первинного ключа, визначені для кластеризованого ключа індексу, які не знаходяться у вторинному індексі , індекс на job_idбуде лише меншим, ніж індекс, job_id, keyword_idякщо keyword_idвін не є частиною кластерного індексу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.