2009-12-31 1 views
4

У меня есть несколько УДАЛИТЬ запросов для запуска против некоторых довольно огромного стола (~ 100 ГБ), и я хочу, чтобы оптимизировать их как можно больше:MySQL удалить оптимизацию оператора

delete from table1 where column1 < date_sub(now(), interval 100 hour); 

column1 является datetime колонком, я предположим, что создание индекса для этого столбца ускорит удаление. кроме того, все, что я могу сделать здесь? будет ли функция date_sub() замедлить запрос? должен ли я рассчитать это значение перед запуском запроса?

delete from table2 where column2 = x; 

column2 является основным ключом для table2, поэтому он уже является индексом в соответствии с документацией mysql. мой вопрос: тип индекса PRIMARY, это то же самое, что и INDEX? мне нужно сделать еще один индекс вида INDEX для ускорения?

delete from table3 where column3 = y; 

таблица3 имеет составной первичный ключ, который является столбцом3 и column4. поэтому у меня есть индекс первичного ключа, но поскольку запрос удаления не использует столбец4, должен ли я сделать отдельный индекс только для столбца3? или объединенный первичный ключ сделал бы это?

Я думаю, что это довольно простые вопросы, но я не мог найти определенного ответа, характерного для моей ситуации, поэтому любая помощь была бы оценена!

+0

Ваш первый шаг будет заключаться в использовании 'EXPLAIN' в этом заявлении delete и выяснить, что он делает. Вставьте его, если вам нужно. – Schwern

+2

'EXPLAIN' работает только для операторов' SELECT' (пока). –

+0

Я предполагаю, что column1 является 'DATETIME', а не' DATE'? Иначе с помощью часового интервала на нем было бы глупо. – Schwern

ответ

2

Я предполагаю, что создание индекса для этого столбца ускорит удаление.

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

будет использовать функцию date_sub(), чтобы замедлить запрос?

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

Тип индекса «ПЕРВИЧНЫЙ», это то же самое, что и «ИНДЕКС»?

Это и основная часть гарантирует, что значения в этом индексе также уникальны.

Мне нужно сделать еще один указатель типа «INDEX» для ускорения?

Нет, вы этого не сделаете. MySQL также ограничивает общий размер индексов, которые могут быть определены в одной таблице, в зависимости от типа. 767 байт - это stated index prefix limitation для таблиц InnoDB; это 1000 байтов для таблиц MyISAM.

таблица3 имеет составной первичный ключ, который является столбцом3 и столбцом4. поэтому у меня есть индекс первичного ключа, но поскольку запрос удаления не использует столбец4, должен ли я сделать отдельный индекс только для столбца3? или объединенный первичный ключ сделал бы это?

Испытание обеих установок & решите. Я не думаю, что дополнительный индекс нужен мне самому.

9

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

Индекс может помочь найти строки, которые необходимо удалить, но удаление требует обновления индекса. После удаления большого количества строк индекс может быть несбалансирован и требует некоторого обслуживания с помощью OPTIMIZE TABLE.

Функция DATE_SUB() является постоянным выражением (оно не меняется по строкам), поэтому оптимизатор запросов должен быть достаточно умным, чтобы учитывать его и выполнять вычисления один раз.

Вам не нужно создавать дополнительный индекс для первичного ключа. Ограничение первичного ключа неявно создает индекс, который дает ту же выгоду, что и индекс непервичного ключа.

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

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