2012-01-26 2 views
1

Какой подход лучше выполнять пакетное удаление в mysql db с помощью jdbc.Mysql performance

У меня есть список первичных ключей. Необходимо удалить их.

  1. использование пакетного обновления api предусмотрено.
  2. delete having where where having having in paragraph.
+1

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

ответ

0

Использовать IN в предложении WHERE быстрее, поскольку оно уменьшает передачу данных. Однако есть компромисс, потому что если запрос слишком длинный, MySQL занимает время, чтобы разобрать его. Я предлагаю вам разбить его на запросы длиной 10 КБ, если у вас слишком много записей для удаления.

Другое решение, когда у вас есть слишком много записей, которые будут удалены, и вы получите их с другим запросом, вы можете использовать непосредственно, например:

DELETE FROM table1 WHERE id IN (SELECT id FROM table2 WHERE status = 1) 
0

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

Сначала я попробовал:

SELECT id FROM table1 WHERE delete_condition 

С

for each delete_id 
    DELETE FROM table1 WHERE table1.id = delete_id 
    DELETE FROM table2 WHERE table2.id = delete_id 
    DELETE FROM table3 WHERE table3.id = delete_id 
loop 

Я нашел это предложил стереть скорость 74 строк в секунду.

Второй подход:

DELETE FROM table2 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition) 
DELETE FROM table3 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition) 
DELETE FROM table1 WHERE table1.id IN (SELECT id FROM table1 WHERE delete_condition) 

Предлагаемая на удаление скорость 43,026 строк в секунду. Я не уверен, что происходит под капотом MySQL, но теперь я буду использовать таблицу DELETE FROM WHERE id IN().