У меня есть таблица в 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 правильный индекс? Я не уверен, какой способ лучше, и будет ли какой-либо из них работать.
status
дляcompany+dept
? - person Rick James   schedule 30.07.2016