Мне трудно разобраться, поэтому позвольте мне спросить вас. Учитывая следующий запрос:
select name from users where company_id = ? and creation_date > ?
Скажем, у нас всего 2 компании и миллионы пользователей каждой компании созданы в разные моменты. Таким образом, мощность creation_date
намного выше. Какие из следующих индексов быстрее и почему?
- index_a (идентификатор компании, дата создания)
- index_b (creation_date, company_id)
- index_c (CREATION_DATE)
- 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)
Для составного индекса столбцов различной мощности имеет значение порядок?