#sql #duplicates #sql-delete #query-performance #mariadb-10.4
#sql #дубликаты #sql-удаление #запрос-производительность #mariadb-10.4
Вопрос:
Я случайно создал большое количество (500K ) неправильных записей в одной таблице. Таблица имеет Face_ID в качестве уникального ключа и Picture_ID в качестве внешнего ключа. Я хочу удалить все записи, в которых есть очень большое количество записей, связанных с одним и тем же значением Picture_ID . Следующий запрос работает отлично и очень быстро:
Select Picture_ID, COUNT(*) From faces Group BY Picture_ID Having COUNT(*) > 1000
Я попробовал следующее, но событие после 20 минут выполнения, запрос все еще выполняется:
delete from faces where Picture_ID IN (Select Picture_ID From faces Group BY Picture_ID Having COUNT(*) > 1000)
Даже если я приведу число (1000 в приведенном выше примере) к значению, которое находит только 3 значения Picture_ID, каждое из которых содержит примерно 1000 записей, запрос все равно занимает очень много времени. (Честно говоря, меня пугает, сколько времени это занимает — заставляет задуматься, что останется от моей базы данных, когда она закончится!)
Каков наиболее эффективный способ закодировать это, используя HeidiSQL и MariaDB в Windows 10.
Комментарии:
1. добавить вывод
show create table faces
иexplain delete from faces ... rest of your delete
2. показать грани создания таблицы: CREATE TABLE
faces
(Face_ID
int(11) NOT NULL AUTO_INCREMENT,X1
int(11) DEFAULT NULL,X2
int(11) DEFAULT NULL,Y1
int(11) DEFAULT NULL,Y2
int(11) DEFAULT NULL,Person_ID
int(11) DEFAULT NULL,Picture_ID
int(11) DEFAULT NULL,FilePath
текст ПО УМОЛЧАНИЮNULL, ПЕРВИЧНЫЙ КЛЮЧ (Face_ID
), КЛЮЧFK__people
(Person_ID
), КЛЮЧFK_faces_pictures
(Picture_ID
) ) ENGINE= InnoDB AUTO_INCREMENT=706450 КОДИРОВКА ПО УМОЛЧАНИЮ = latin13. Я не уверен, какую часть вы не понимаете. Я пытаюсь удалить записи из таблицы faces на основе выбора Picture_IDs. Идентификаторы PICTURE_ID выбираются на основе тех идентификаторов picture_id, которые связаны с более чем 1000 записями в таблице faces.
4. не могли бы вы показать вывод запроса на ОБЪЯСНЕНИЕ, пожалуйста? (отредактируйте свой вопрос и добавьте его), который должен показать, что происходит не так
Ответ №1:
Я нашел ответ:
УДАЛЕНИЕ a из faces ОБЪЕДИНЕНИЕ (выберите Picture_ID из группы faces ПО Picture_ID С КОЛИЧЕСТВОМ (*)> 1000) b НА a.Picture_ID = b.Picture_ID
Это работает, и это БЫСТРО!