Как правильно использовать индекс для большой таблицы mysql?

У меня есть таблица в MySQL 5.7.13, в которой 3 столбца (на самом деле больше, но эти три используются для поиска) - в ней есть столбец company_id, есть столбец department_id и есть столбец status.

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

Поэтому мне казалось естественным использовать сложный индекс (company_id, Department_id, статус) из-за префиксного порядка индекса mysql. Так как они всегда фильтруют по компании и отделу, а иногда и по статусу, вроде все нормально.

Однако недавно была добавлена ​​новая функция. Есть и специальные сотрудники, которые, в отличие от обычных пользователей, выбирают только компанию, а не отдел. Таким образом, их запрос фильтруется по компании и статусу. И это означает, что индекс ломается, он будет фильтровать только по компании, а не по статусу, потому что отдел опущен.

Что такое обходной путь по этому поводу? Я вижу здесь два решения. Во-первых, статус очень ограничен - в основном он имеет значения - СОЗДАН (1), ОТПРАВЛЕН (2), ПРИНЯТ (3), ОТКЛОНЕН (4). Итак, я могу создать индекс (company_id, status, Department_id), и если пользователь не выбирает какой-либо статус, я могу добавить в запрос что-то вроде этого:

AND status in (1,2,3,4)

Будет ли индекс работать эффективно для этого? Или другое решение состоит в том, чтобы создать второй индекс и иметь как (company_id, Department_id, статус), так и (company_id, статус, Department_id), но выберет ли оптимизатор mysql правильный индекс? Я не уверен, какой способ лучше, и будет ли какой-либо из них работать.


person SPIRiT_1984    schedule 29.07.2016    source источник
comment
Сколько строк в таблице? Каково типичное количество строк для одной компании? Каков максимум? Есть только один status для company+dept?   -  person Rick James    schedule 30.07.2016


Ответы (1)


Из того, что я вижу, это должно работать нормально. Оптимизатор будет использовать индекс для составного (x,y,z) и при необходимости выполнит using index; using where. Обратите внимание, что я понимаю, что самая левая часть составного элемента уже является частью вашего предложения where, например, x позволяет y уже быть в миксе для использования в индексе.

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

Естественно, просмотрите страницу руководства MySQL под названием EXPLAIN Syntax и что-то вроде Использование EXPLAIN для написания лучших запросов MySQL .

person Drew    schedule 29.07.2016