Производительность MySQL - PullRequest
1 голос
/ 26 января 2012

Какой подход лучше сделать пакетным удалением в MySQL DB с использованием JDBC.

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

  1. использовать пакетное обновление API.
  2. удалить, имеющий пункт where, имеющий в пункте.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2012

У меня была похожая проблема, и я решил сравнить два подхода, используя подготовленные операторы и драйвер 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 table WHERE id IN ().

0 голосов
/ 26 января 2012

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

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

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