Использует ли MySQL существующие индексы при создании новых индексов? - PullRequest
2 голосов
/ 02 октября 2010

У меня большая таблица с миллионами записей.

Table `price`
------------
id 
product 
site 
value

Таблица совершенно новая, индексы не созданы.

Затем я отправил запрос на создание нового индексас помощью следующего запроса:

CREATE INDEX ix_price_site_product_value_id ON price (site, product, value, id);

Это заняло много времени, в прошлый раз, когда я проверял пробег 5000+ секунд, из-за машины.создание, будет ли он использовать существующий индекс в процессе расчета?Если да, то в какой форме?

Далее для запуска запроса 1:

CREATE INDEX ix_price_product_value_id ON price (product, value, id);

Далее для запуска запроса 2:

CREATE INDEX ix_price_value_id ON price (value, id);

Ответы [ 2 ]

5 голосов
/ 02 октября 2010

Мне интересно, если я выпущу еще одно создание индекса, будет ли он использовать существующий индекс при расчете процесса?Если да, то в какой форме?

Нет, не будет.

Теоретически, индекс на (site, product, value, id) имеет все необходимое для построения индекса на любом подмножестве этих полей (включая индексы (product, value, id) и (value, id)).

Однако создание индекса из вторичного индекса не поддерживается.

Во-первых, MySQL не поддерживает быстрое сканирование полного индекса(то есть сканирование индекса в физическом порядке, а не в логическом), что делает путь доступа к индексу более дорогим, чем чтение таблицы.Это не проблема для InnoDB, поскольку сама таблица всегда кластеризована.

Во-вторых, порядки записей в этих индексах совершенно разные, поэтому записи все равно нужно сортировать.

Однако основная проблема со скоростью создания индекса в MySQL заключается в том, что он генерирует порядок на месте (просто вставляя записи по одной в B-Tree) вместо использования предварительно отсортированного источника.Как отметил @Daniel, быстрое создание индекса решает эту проблему.Он доступен как плагин для 5.1 и поставляется с предустановленным 5.5.

4 голосов
/ 02 октября 2010

Если вы используете MySQL версии 5.1 и механизм хранения InnoDB, вы можете использовать InnoDB Plugin 1.0 , который поддерживает новую функцию под названием Быстрое создание индекса .Это позволяет механизму хранения создавать индексы, не копируя содержимое всей таблицы.

Обзор плагина InnoDB:

Начиная с версии 5.1, MySQL AB продвигает идею«подключаемая» архитектура механизма хранения, которая позволяет добавлять несколько механизмов хранения в MySQL.Однако в настоящее время большинство пользователей имеют доступ только к тем механизмам хранения, которые распространяются MySQL AB и связаны с бинарными (исполняемыми) выпусками.

С 2001 года MySQL AB распространяет механизм транзакционного хранения InnoDB срелизы (как исходные, так и двоичные).Начиная с версии MySQL 5.1, пользователи могут менять одну версию InnoDB и использовать другую.

Источник: Введение в плагин InnoDB

Обзор быстрого создания индекса:

В версиях MySQL до 5.0 добавление или удаление индекса в таблице с существующими данными может быть очень медленным, если в таблице много строк.Команды CREATE INDEX и DROP INDEX работают путем создания новой пустой таблицы, определенной с запрошенным набором индексов.Затем он копирует существующие строки в новую таблицу один за другим, обновляя индексы по мере необходимости.Вставка записей в индексы таким образом, когда значения ключей не отсортированы, требует произвольного доступа к узлам индекса и далека от оптимальной.После копирования всех строк из исходной таблицы старая таблица удаляется, а копия переименовывается с именем исходной таблицы.

Начиная с версии 5.1, MySQL позволяет механизму хранения создавать или удалять индексы безкопирование содержимого всей таблицы.Однако стандартная встроенная InnoDB в MySQL версии 5.1 не использует эту возможность.Однако с плагином InnoDB пользователи могут в большинстве случаев добавлять и удалять индексы гораздо эффективнее, чем в предыдущих выпусках.

...

Изменение кластеризованного индекса требует копирования данных, даже еслиплагин InnoDB.Однако добавление или удаление вторичного индекса с помощью плагина InnoDB происходит намного быстрее, поскольку не требует копирования данных.

Источник: Обзор быстрого создания индекса

...