Подтвердить что ты не робот

Может ли MySQL использовать несколько индексов для одного запроса?

Представьте таблицу с несколькими столбцами, скажем, id, a, b, c, d, e. Обычно я выбираю id, однако в клиентском приложении несколько запросов, которые используют различные условия над подмножествами столбцов.

Когда MySQL выполняет запрос в одной таблице с несколькими условиями WHERE на нескольких столбцах, может ли он действительно использовать индексы, созданные в разных столбцах? Или единственный способ сделать это быстро - создать многоколоночные индексы для всех возможных запросов?

4b9b3361

Ответ 1

Да, MySQL может использовать несколько индексов для одного запроса. Оптимизатор определит, какие индексы будут полезны для запроса. Вы можете использовать EXPLAIN для получения информации о том, как MySQL выполняет оператор. Вы можете добавлять или игнорировать индексы, используя такие подсказки:

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;

Я бы предложил прочитать как MySQL использует индексы.

Всего несколько выдержек:

Если есть выбор между несколькими индексами, MySQL обычно использует индекс, который находит наименьшее количество строк.

Если в столбцах col1 и col2 существует указатель с несколькими столбцами, соответствующий строки могут быть выбраны напрямую. Если существуют отдельные индексы с одним столбцом на col1 и col2, оптимизатор попытается использовать слияние индексов оптимизации (см. раздел 8.3.1.4, "Оптимизация слияния индексов" ) или попытайтесь найти наиболее ограничительный индекс, решив, какой индекс находит меньше строк и использует этот индекс для извлечения строк.

Ответ 2

Классически MySQL может использовать один индекс для ссылки на таблицу в заданном запросе. Однако в более поздних версиях MySQL может выполняться операция под названием index merge и разрешить MySQL использовать более одного индекса для каждой таблицы.

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

Ответ 3

Mysql может использовать объединение индексов для объединения результатов двух индексов. Но это не совсем предпочтительный способ MySQL. Он будет использовать два индекса, если это оптимизирует выполнение запроса. но это также подсказка для разработчика запросов для создания составного индекса.

Слияние индекса ни в коем случае не эквивалентно составному индексу. вот выдержка из книги барона Шварца -

Стратегия слияния индексов иногда работает очень хорошо, но чаще она фактически указывает на плохо проиндексированную таблицу:

• Когда сервер пересекает индексы (обычно для условий AND), это обычно означает, что вам нужен один индекс со всеми соответствующими столбцами, а не несколько индексов, которые необходимо объединить.
• Когда сервер объединяет индексы (обычно для условий ИЛИ), иногда операции буферизации, сортировки и объединения алгоритмов используют много ресурсов ЦП и памяти. Это особенно верно, если не все индексы очень избирательны, поэтому при сканировании возвращается много строк в операцию слияния.