MySQL Btrees: имеет ли значение кардинальность и порядок столбцов для составного индекса, когда используются все столбцы? - PullRequest
0 голосов
/ 06 июля 2018

Мне трудно разобраться, поэтому позвольте мне спросить вас. Учитывая следующий запрос:

select name from users where company_id = ? and creation_date > ?

Скажем, у нас всего 2 компании и миллионы пользователей каждой компании созданы в разные моменты. Таким образом, мощность creation_date намного выше. Какие из следующих индексов быстрее и почему?

  1. index_a (идентификатор компании, дата создания)
  2. index_b (creation_date, company_id)
  3. index_c (CREATION_DATE)
  4. index_d (company_id)

Какой индекс быстрее (или теоретически равен)? Игнорируйте использование дискового пространства, если это не влияет на производительность чтения. Что я думаю:

(index_b ~= index_c) > index_a > index_d Поскольку в Btree «метка времени» будет сгруппирована в одном регионе, поэтому выборка будет остановлена ​​раньше. company_id на самом деле не имеет значения, потому что БД необходимо будет использовать ROWID из индекса, чтобы коснуться строки таблицы, чтобы получить name для SELECT. Почти нет различий. На втором месте стоит index_a, который "группирует" низкое значение мощности в BTREE, поэтому требуется некоторое время, чтобы "b-search" показал его значение, ограничивая область поиска с помощью creation_date (который находится в «хвост» индекса). И, наконец, index_d хуже по очевидным причинам (например, количество элементов в 2 на миллион строк).

Вопрос Бонуса: Что, если бы у нас было 10kk строк, 5kk для компании A и Company B и 7kk временных меток, распределенных равномерно для обеих компаний и других 3kk абсолютно разных временных меток. Будет ли поиск в этом диапазоне 7kk намного хуже, чем в диапазоне 3kk?

Это правильно? Чего мне не хватает?

(Отличное место для визуализации алгоритмов: https://www.cs.usfca.edu/~galles/visualization/BTree.html)

P.S .: Здесь есть два противоречивых ответа в StackOverflow:

упорядоченное упорядочение ключей в составном индексе MySQL (WRT Rails, полиморфные ассоциации и STI)

Для составного индекса столбцов различной мощности имеет значение порядок?

1 Ответ

0 голосов
/ 06 июля 2018

Для этого конкретного запроса index_a должен быть самым быстрым, потому что результаты точно соответствуют диапазону в индексе.

Использование index_b или index_c медленнее. Вы должны получить диапазон допустимых дат, а затем отфильтровать строки с неправильным идентификатором компании. Index_c медленнее, потому что вам нужно коснуться строк, которые вы отфильтровываете.

Использование index_d является самым медленным. Вы можете найти диапазон для идентификатора компании, но затем нужно отсканировать все строки на предмет совпадения дат.

...