MySQL: почему DELETE более интенсивно использует процессор, чем INSERT? - PullRequest
7 голосов
/ 17 февраля 2011

В настоящее время я учусь на курсе «Оценка производительности» в университете, и сейчас мы выполняем задание, в котором мы тестируем использование процессора на сервере баз данных PHP и MySQL. Мы используем httperf для создания пользовательского трафика и vmstat для отслеживания нагрузки на сервер. Мы выполняем 3000 подключений к PHP-серверу как для INSERT, так и для DELETE (запускаются отдельно).

Числа показывают, что операция DELETE требует гораздо больше ресурсов процессора, чем INSERT, и мне просто интересно, почему?

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

Ответы [ 3 ]

5 голосов
/ 17 февраля 2011

По крайней мере, с InnoDB (и я надеюсь, что они вас там), у вас больше операций даже без внешних ключей .Вставка примерно такая:

  1. Вставить строку
  2. Пометить в буфере двоичного журнала
  3. Пометить фиксацию

При удалении выполняются следующие действия:

  1. Пометить удаленную строку (принимая тот же удар, что и при вставке - страница перезаписывается)
  2. Пометить в двоичном буфере журнала
  3. Пометить зафиксировано
  4. На самом деле удалите строку, (принимая тот же удар, что и вставку - страница перезаписана)
  5. Очистить поток также отслеживает удаления в двоичном буфере журнала.

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

3 голосов
/ 17 февраля 2011

УДАЛЕНИЕ также требует записи данных на диск, плюс пересчет индексов и, кроме того, набор логических сравнений, чтобы найти записи, которые вы пытаетесь удалить в первую очередь.

1 голос
/ 17 февраля 2011

Удаление требует больше логики, чем вы думаете; насколько это зависит от структуры схемы.

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

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

...