LINUX.ORG.RU
ФорумAdmin

Mysql медленно удаляет 1млн. запсей.

 


1

2

Подскажите, что делать. Надо постоянно удалять и записывать большые объемы данных. Вначале база стояла на mssql это занимало около 1 мин, а mysql > 10мин.
Что нужно сделать, чтобы он удалял примерно также как и mssql?
Запрос типа
delete from tabl where idlpu=1059


Нужно поставить платную версию MySQL, которая называется Oracle.

anonymous
()

попробуй таблицу без индексов, но это даст тебе линейную скорость выборки.

если данные партицируются - то партицируй и дропай нужную партицию.

TOXA ★★
()
Ответ на: комментарий от TOXA

Нужно поставить платную версию MySQL, которая называется Oracle.

Это не совет. Если Вам надо - вы и ставте.

попробуй таблицу без индексов, но это даст тебе линейную скорость выборки.

 ALTER TABLE table1   DISABLE KEYS;
 delete from table1 where idlpu=1050;
Query OK, 617084 rows affected (30.75 sec)
ALTER TABLE table1 ENABLE KEYS;

Вроде более менее нормально. Попробую на рабочем серваке.

mnk
() автор топика
Ответ на: комментарий от mnk

Правда пока еще не знаю, сколько будут создаваться индексы в таблице, где около 50млн записей. Проверю - отпишусь.

mnk
() автор топика

delete from tabl where idlpu=1059

Попробуй добавить специальную метку «удалённое», и удалять вот так: update tabl set deleted=1 where idlpu=1059, в индекс deleted не включать. А потом, удалять помеченные к удалению скопом.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

mnk, рассмотри способ, предложенный выше. удалять все лишнее можно в моменты неактивности(ночью, например) если таковые вообще имеются

TOXA ★★
()

Они влажные и пахнут девелоперами

Прошу прощения, не смог удержаться

router ★★★★★
()

поищи сравнительные таблицы по скоростям вставки удаления и обновления, mysql реально лажается

anonymous
()
Ответ на: комментарий от anonymous

поищи сравнительные таблицы по скоростям вставки удаления и обновления, mysql реально лажается

А ссылочку можно, а то что то не нашел.

mnk
() автор топика

Дайте хотя бы схему таблицы?
Может некоторые индексы нужно удалить/добавить?
Какой формат таблицы?

<< ALTER TABLE table1 DISABLE KEYS;
Скорее всего будет еще дольше, чем удаление

kiotoze ★★★★
()

При условии, что тиблицы InnoDB, это может помочь повысить производительность.

~]$ cat /etc/my.cnf
...
innodb_flush_log_at_trx_commit=2
innodb_doublewrite=0
innodb_support_xa=0
innodb_checksums=0
...

fjoe
()

Ещё поиграйся с SET TRANSACTION ISOLATION LEVEL. И работай в рамках транзакции.

AlexVR ★★★★★
()
Ответ на: комментарий от Komintern

Про объемы никто не говорил.

Говорилось про количество строк. Но если там 2 цифровых колонки или 100 колонок половина из которых TEXT, BLOB то ситуация может различаться кардинально вне зависимости от используемой РСУБД.

hidden_4003
()

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

MrClon ★★★★★
()
Ответ на: комментарий от hidden_4003

Строк там около 30, есть разные. blob и text - нет. И около 10 индексов по разным столбцам. Если важно - завтра могу выложить
show create table

mnk
() автор топика
Ответ на: комментарий от Komintern

А Вы думаете - postgres - быстрее? Не нашел таких данных.
Таблицы - справочные, только select`ы. Может конвертнуть таблицу в myisam?

mnk
() автор топика
Ответ на: комментарий от i-rinat

Попробуй добавить специальную метку «удалённое», и удалять вот так: update tabl set deleted=1 where idlpu=1059, в индекс deleted не включать. А потом, удалять помеченные к удалению скопом.

++ годный совет, удаление в любом случае требует много времени.

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

emulek
()
Ответ на: комментарий от mnk

myisam во время update, delete блокирует всю таблицу, если таблица активно читается это может вызвать задержки в select.

hidden_4003
()
Ответ на: комментарий от mnk

А Вы думаете - postgres - быстрее? Не нашел таких данных.

PostgreSQL скорее всего будет тоже медленно удалять. Я попробовал простой тест, удалил 1млн записей из 10млн - около 30 сек (при том что select этих записей около 2 сек, seq. scan).

Update отрабатывает не быстрее чем delete, так что помечать для удаления а потом удалять в PostgreSQL не даст прироста скорости. В MySQL хз, нет под рукой

anonymous
()
Ответ на: комментарий от anonymous

PostgreSQL скорее всего будет тоже медленно удалять. Я попробовал простой тест, удалил 1млн записей из 10млн - около 30 сек (при том что select этих записей около 2 сек, seq. scan).

А сколько столбцов и индексов в Вашей таблице?

mnk
() автор топика
Ответ на: комментарий от mnk

А сколько столбцов и индексов в Вашей таблице?

3 поля: id(int), data1 (text), data2 (int). Заполнял все три поля числами от 1 до 10млн. Индекс по id, но я строил запрос который делает полный перебор ("... where mod(data2, 10)=0" - выбирает каждую 10-ю строку).

Ну, даже если удаление будет выполняться минуту или около того, мне кажется это слишком долго.

Если для этой БД удаление частая операция, надо оптимизировать, конечно. Как уже написали, партиционировать и дропать партиции целиком, например

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.