Есть ли способ оптимизировать запрос при извлечении нескольких записей на основе внешнего ключа? - PullRequest
0 голосов
/ 05 января 2019

У меня следующий запрос:

delete from tbl_table
where user = '123'

доступ к примеру tbl_table:

id user phonenumber
1 123 (408)555-5555
2 123 (415)555-5555
3 123 (913)555-5555

когда я запускаю удаление, это занимает 7000+ мс, что кажется чрезмерным. Это в таблице записей 400 КБ.

Хотите знать, как я могу структурировать БД или запрос, чтобы потенциально выполнить меньше времени?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Это немного сложно. Производительность удаления зависит от многих факторов:

  • Сколько времени нужно, чтобы найти строки, которые нужно удалить?
  • Сколько строк удаляется?
  • Какие индексы, построенные на таблице, также необходимо изменить?
  • Что еще происходит в системе?
  • Какие триггеры удаления определены в таблице?

Это затрудняет ответ на вопрос. Первые два можно адресовать. Для первого помогает индекс:

create index idx_tbl_table_user on tbl_table(user);

Чтобы использовать этот индекс, убедитесь, что у вас есть правильные типы. Числовые идентификаторы обычно хранятся в виде чисел, а не строк - и преобразования типов могут иногда препятствовать использованию индексов. Поэтому, если user - это число, вы хотите написать:

where use = 123

Вторая проблема удаления «слишком большого количества» строк может быть решена более трудным способом. Вы можете создать временную таблицу с данными, которые вы хотите сохранить, обрезать исходную таблицу и заново вставить значения. Увы, я сомневаюсь, что вы могли бы закончить это за 7 секунд, так что это не вариант.

Что касается остальных трех, вам необходимо провести дополнительное исследование вашей системы и таблиц, если они являются причиной задержки. Конечно, если проблема заключается в загрузке системы, то выполнение запроса в более спокойное время ускорит запрос.

0 голосов
/ 05 января 2019

Наилучшим подходом будет

  • Создать индекс для пользовательского столбца.
  • сделай свою операцию
  • удалить ваш индекс (если это однократная операция)


CREATE INDEX idx_tbl_user ON tbl_table (user); 
DELETE FROM tbl_table WHERE user = '123'; 
DROP INDEX idx_tbl_user;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...