MySQL: медленные вставки в PK B + Tree медленнее, чем вставки во вторичном индексе B + Tree? - PullRequest
0 голосов
/ 29 марта 2011

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

А как насчет вторичных индексов? Скажем, у моей таблицы есть вторичный индекс. Вставки будут в порядке относительно кластерного индекса PK, но не в порядке относительно вторичного индекса B + Tree.

Так не будет ли вставка все еще медленной, потому что MySQL должен постоянно переупорядочивать вторичный индекс B + Tree по мере поступления вставок?

Мне просто интересно, действительно ли использование автоинкремента дает мне что-то с точки зрения производительности вставки. Буду очень признателен за некоторые разъяснения здесь.

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

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

0 голосов
/ 13 апреля 2011

Ваше основное предположение верно только в том случае, если у вас есть таблица только для записи (или, по крайней мере, только для обновления).Если вы удаляете записи, PK для новых записей будут вставлены не последовательно (физически).

Эффективность вставок в индекс почти всегда является второстепенным фактором, а возмущение этим является антипаттерном преждевременной оптимизации.Рассматривали ли вы, как правило, более существенные проблемы кардинальности, длины ключевых полей, размеров кэша и т. Д.?

Использование суррогатных автоинкрементов в первую очередь обычно неоптимально - обычно есть более полезный уникальный ключ с реальными значениями, которыекластер в более значимых отношениях.(И вы можете кластеризовать только таблицы innodb - вы это понимаете, верно?)


«Кластеризация» означает, что индекс по существу - это таблица.Так что это выгодно при вставке суррогатного ключа, потому что все добавляется в конец таблицы, потому что следующее значение индекса всегда выше, чем любое предыдущее (как вы уже знаете).

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

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


Вы не указали innodb, поэтому я ответил в первую очередьдля myisam (по умолчанию), где только автоинкремент или хронологический индекс будут симулировать кластеризацию - явной опции нет.

...