optomise очень большой запрос таблицы - PullRequest
0 голосов
/ 02 августа 2011

У меня есть таблица, которая близка к 20 миллионам записей и растет. Таблица была настроена как innodb. Существует первичный индекс по двум основным полям:

`entries_to_fields`
entry_id    int(11) NO  PRI NULL     
field_id    int(11) NO  PRI NULL     
value   text    NO      NULL     

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

DELETE FROM `entries_to_fields` WHERE `entry_id` IN (SELECT `id` FROM `entries` WHERE `form_id` = 196)

При этом удаляются все данные ввода для конкретной формы.

В настоящее время это занимает более 45 секунд, даже если таблица записей не возвращает результатов.

У меня вопрос: может ли я внести простое изменение в структуру entries_to_fields, или я могу продолжить свой запрос?

Ответы [ 3 ]

3 голосов
/ 02 августа 2011

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

DELETE entries_to_fields
FROM entries_to_fields
JOIN entries
ON entries_to_fields.entry_id = entries.id
WHERE entries.form_id = 196

... поле records.form_id должно быть проиндексировано.

1 голос
/ 02 августа 2011

Я бы посмотрел на план запроса, я предполагаю, что подзапрос возвращает NULL и выполняет полное сканирование удаления.

см .:

http://dev.mysql.com/doc/refman/5.0/en/in-subquery-optimization.html

1 голос
/ 02 августа 2011

После небольшого количества проб и ошибок + поиска в Google, я обнаружил, что использование IN в полях индекса в больших таблицах - очень плохая практика.

Я разбил подзапрос на отдельный запрос изатем создал динамический запрос следующим образом:

DELETE FROM `entries_to_fields` WHERE `entry_id` = 232 OR `entry_id` = 342 ...

Несмотря на создание потенциально большого запроса, теперь он выполняется в течение ~ 1 секунды.Даже при удалении 1000 записей.

...