MySQL. Создание индекса для запросов «ИЛИ» - PullRequest
13 голосов
/ 23 марта 2012

У меня есть таблица из 200 тыс. Записей со столбцами INT.Я хочу создать индекс, чтобы сделать запросы быстрее.Это запрос, который я хотел бы выполнить: SELECT A,B,C,D,E FROM table WHERE A=23 and (B=45 or C=43).Я создал следующие индексы: B, ACD, C, ABC.

С помощью команды EXPLAIN я обнаружил, что MySQL выбирает индекс ACD.Поэтому я продолжал заполнять таблицу большим количеством значений и понял, что MySQL переключался между указанными выше индексами (не всегда одинаковыми).

Поскольку существует много вставок, наличие различных индексов приведет к проблемам с производительностью, и мы можемПредположим, что к этой таблице обращаются другие запросы, которым требуются разные столбцы, где каждый индекс имеет смысл.

Мне известно о USE INDEX(), но я хотел бы понять, стоит ли доверять MySQL для выбора правильного индекса.

Ответы [ 2 ]

8 голосов
/ 23 марта 2012

Из-за OR в выражении SQL MySQL просто получает первый индекс, включающий A, то есть ACD.

Я пришел к выводу, что способ решить эту проблемупроблема с использованием INDEX состоит в том, чтобы сделать два отдельных запроса.SELECT A,B,C,D,E FROM table WHERE A=23 AND B=45, который будет использовать INDEX ABC, а затем SELECT A,B,C,D,E FROM table WHERE A=23 AND C=43, который будет использовать INDEX ACD.Все это можно сделать за один шаг с помощью (...) UNION (...), который оказывается быстрее и использует только INDEX.

0 голосов
/ 23 марта 2012

Mysql может использовать только самую левую часть составного индекса. Т.е., если ваша инструкция where выглядит как

WHERE A=1 AND B=2

тогда MySQL может использовать индекс для A или AB, но лучше всего будет AB. ACB нельзя использовать, так как индекс разделен на другой столбец

С вашим заданным предложением WHERE я не думаю, что механизм запросов MySQL может использовать несколько индексов. Я бы сделал AB и AC и с помощью FORCE INDEX посмотреть, какой из них быстрее.

Трехкомпонентный составной ключ в этом случае не поможет, если вы смотрите на А и еще один столбец. Этот тип ключа поможет, если ваш запрос использует AND вместо OR. Индекс на ABC будет полезен для

WHERE A=1 AND B=2 AND C=3
...