2013-04-12 2 views
0

Недавно я обнаружил, что на одном из серверов есть высокий трафик ввода-вывода на диске. Высокий ввод-вывод из-за написания индекса на определенной таблице после некоторой диагностики. Я сделал несколько тестов оценки и обнаружил, что mysql занимает большое количество записей при вставке записей в таблицу с большим индексом.Производительность вставки ухудшается с большим индексом (MYSQL)

Тип данных индексированных столбцов - это varchar (15) и varchar (17), оба являются неидеальными индексами , но есть только 80 записей на диске, если я загружаю 20000 записей в таблицу, которая имеет 10000 записей, тогда как есть 1700 пишет на диске, когда таблица вырастает до 20 миллионов (что получило около 1 миллиона различных значений в индексированных столбцах) даже количество вставленных записей одинаково.

Двигатель MyISAM.

Увеличивает размер индексов, увеличивая также число записей на диске для каждой вставки.

Это поведение индекса BTREE и как я могу решить эту проблему?

ответ

3

Используйте InnoDB вместо MyISAM.

InnoDB помогает путем буферизации записывать вторичные индексы, сжимая их, если это возможно, и задерживает дорогостоящие операции ввода-вывода. Подробнее об этой функции можно прочитать в Руководстве по MySQL в разделе Controlling InnoDB Change Buffering.


Re ваш комментарий:

Подставив новое значение в B-Tree может быть дорогим. Если на уровне листа нет места, вставка может вызвать каскадный эффект разделения нелистовых узлов дерева, потенциально вплоть до вершины дерева. Это может привести к большому количеству операций ввода-вывода, поскольку различные узлы дерева могут храниться далеко друг от друга на диске.

Другие стратегии смягчения - сделать таблицу меньшей, перемещая менее используемые данные в другую таблицу. Или используя MySQL table partitioning, чтобы сделать одну логическую таблицу состоящей из множества отдельных физических таблиц. Каждая такая подкатегория должна иметь одинаковые индексы, но тогда каждый отдельный индекс будет меньше.


Там в анимированный пример здесь: http://www.bluerwhite.org/btree/

Посмотрите на примере «Вставка ключа 33 в B-Tree (ж/Split)», где показаны этапы вставки значения в B -tree узел, который переполняет его, и то, что B-tree делает в ответ.

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

+0

Благодарим за ответ, есть ли другой способ уменьшить ввод-вывод при записи индекса, поскольку таблица находится в рабочей среде и не предпочитает менять его движок. Кроме того, дорогостоящий ввод-вывод - это характер BTREE или любая причина такого обстоятельства. – Holylai

+0

Большое спасибо за то, что вы ясно объясните, что означает ввод-вывод из-за операции по расщеплению узлов при переполнении листового узла, и это дорого стоит, когда дерево растет?Поскольку я не совсем понимаю алгоритмы B-дерева, это поведение добавляется ко всем rdbms, таким как ORACLE (несмотря на ввод/вывод в буфере) – Holylai

+0

Я получил его, большое спасибо, но почему первичный индекс не вызывает такой проблемы? – Holylai

Смежные вопросы