Как заказать столбец в индексе Multi-столбцы для лучшей производительности в Mysql - PullRequest
2 голосов
/ 30 мая 2019

Допустим, у меня есть таблица транзакций в базе данных mysql, я хочу создать многостолбцовый индекс по 3 столбцам: ссылка, вид и статус. У меня есть запрос, который я пытаюсь ускорить: Transaction.where(parent_ref: merchant_ref, kind: 'OFFER',status: 1), который выполняет следующий SQL:

SELECT `merchant_transactions`.* FROM `merchant_transactions` 
WHERE `merchant_transactions`.`parent_ref` = '1-0001' 
 AND `merchant_transactions`.`kind` = 'BATCH_BET' 
 AND `merchant_transactions`.`status` = 1

Столбец parent_ref может принимать очень широкий диапазон значений, поэтому, если в этой таблице будет 1M записей, у меня будет 500K разных ссылок. Статус может принимать только 6 различных значений и только 3 типа. Какой будет лучший порядок для столбцов в моем индексе для оптимальной производительности. Влияет ли распространение значений в моих столбцах? Интуитивно я бы сказал, что мне нужно начать со столбца с наименьшим разбросом значений. Таким образом, в этом примере я бы сделал указатель (вид, статус, ссылка). Существуют ли другие факторы, связанные со значениями в моих таблицах, которые необходимо учитывать при определении порядка столбцов для моего индекса?

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Хорошо, теперь, когда вы поделились запросом, мы можем видеть, что вы ссылаетесь на все три столбца в предложении WHERE, все три предиката проводят сравнения на равенство, а выражение в предложении WHERE использует только AND операции.

Нет более экзотических частей запроса, таких как JOIN, GROUP BY, ORDER BY, DISTINCT и т. Д., Чтобы усложнить оптимизацию этого запроса.

Учитывая этиУсловия, по моему опыту, порядок столбцов вряд ли имеет значение.Если есть какая-либо разница, она едва заметна.

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

0 голосов
/ 01 июня 2019

В вашем примере каждый из 3 столбцов протестирован с =, и они ANDd вместе. Поэтому создайте композицию из 3 столбцов с этими 3 столбцами. Порядок столбцов не будет иметь значения для этого запроса. Вопреки тому, что могут сказать другие, «кардинальность» отдельных столбцов не имеет значения в совокупности INDEX.

См. Мою индексную кулинарную книгу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...