2012-05-18 3 views
3

У меня возник вопрос, когда я пытаюсь удалить более 100 000 строк из таблицы mysql, и сервер не зависает, а не на его веб-сайтах.Удалите более 100 000 строк из таблицы mysql - сбои сервера

Я ждал 2 часа, а затем перезапустил сервер и восстановил учетную запись.

Я использовал следующий запрос:

DELETE FROM `pligg_links` WHERE `link_id` > 10000 

-

SELECT* FROM `pligg_links` WHERE `link_id` > 10000 

работает отлично

есть лучший способ сделать это?

+0

Есть ли каскад удаляет или триггеры участвуют? Существуют ли возможные открытые транзакции, блокирующие таблицу (или связанные таблицы) во время удаления? Это удаление должно выполняться в считанные секунды. – mellamokb

+0

@mellamokb извините, но я не знаю, какие каскадные удаления или триггеры, я могу сказать, что я ничего не менял по стандартным настройкам: SELECT * FROM 'pligg_links' WHERE' link_id'> 10000 отлично работает – Chriswede

+0

удаление 100k должно занять несколько минут. Если это занимает 2 часа, что-то не так, и я предлагаю вам исследовать и учиться на нем. Что такое движок таблицы? сколько записей на этой таблице? вы удаляете таблицу myisam при производстве (возможно, блокировка таблицы)? У вас есть указатель на link_id/или это ПК? ваш сервер mysql перегружен? что вы подразумеваете под «восстановлением учетной записи»? есть ли у вас LOTS на других таблицах данных и innnodb, настроенных без innodb_file_per_table? являются mysql params (например, key_buffer для myisam и пула буферов для настроенного OK)? –

ответ

2

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

+0

как это можно сделать Я довольно плохой mysql;) – Chriswede

+2

DELETE FROM 'pligg_links' WHERE' link_id'> 10000 и 'link_id' <20000 –

+0

УДАЛИТЬ ОТ' pligg_links' WHERE 'link_id'> = 20000 и' link_id' < 30000 –

0

Убедитесь, что у вас есть указатель на столбец link_id. И попробуйте удалить с кусками, как 10.000 за раз. Удаление из таблицы - очень дорогостоящая операция.

+0

Как это можно сделать Я довольно плохой mysql;) – Chriswede

+0

, если вы обычно сортируете столбец link_id, затем добавьте следующую строку в команду create table 'primary key (link_id)' – qwerty9967

+0

@ qwerty9967 вот так?УДАЛИТЬ ОТ первичного ключа (link_id) WHERE link_id> 10000 – Chriswede

1

«Удалить из» может быть очень дорогостоящим для больших наборов данных.

Я рекомендую использовать разделение.

Это может быть сделано несколько иначе в PostgreSQL и MySQL, но в PostgreSQL вы можете создать множество таблиц, которые являются «разделами» большей таблицы или раздела. Запросы и многое другое можно запустить в большой таблице. Это может значительно увеличить скорость, с которой вы можете запросить заданный раздел правильно. Кроме того, вы можете удалить раздел, просто отбросив его. Это происходит очень быстро, потому что это несколько эквивалентно отбрасыванию таблицы.

Документация для разделения таблицы можно найти здесь:

http://www.postgresql.org/docs/8.3/static/ddl-partitioning.html

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