Я создал многостолбцовый индекс mysql для таблицы транзакций.Этот индекс использует 3 столбца, как описано в моей схеме rails:
add_index "merchant_transactions", ["reference", "parent_ref", "kind"], name: "by_reference_parent_ref_kind", using: :btree
Теперь у меня есть запрос активной записи:
MerchantTransaction.where(reference: "2-9020", kind: "PLACE_BATCH")
, который в чистом sql дает:
"SELECT `merchant_transactions`.* FROM `merchant_transactions` WHERE `merchant_transactions`.`reference` = '2-9020' AND `merchant_transactions`.`kind` = 'PLACE_BATCH'"
Теперь из того, что я прочитал об индексации mysql и нескольких столбцов:
Если таблица имеет индекс из нескольких столбцов, любой крайний левый префикс индекса может использоваться оптимизатором для поиска строк,Например, если у вас есть индекс из трех столбцов (col1, col2, col3), у вас есть индексированные возможности поиска для (col1), (col1, col2) и (col1, col2, col3).Для получения дополнительной информации, см. Раздел 8.3.5 , «Индексы с несколькими столбцами».
Для меня это означает, что предыдущий запрос не должен использовать предыдущий индекс.
Однако, когда я запускаю EXPLAIN для моего запроса MerchantTransaction.where(reference: "2-9020", kind: "PLACE_BATCH").explain
в столбце key
, я получаю by_reference_parent_ref_kind
, а в столбце Extra
у меня есть Using index condition
, что, по-видимому, означает, что индекс фактически используется.
Как это возможно?