Удаление записей с использованием HeidiSQL на основе count

#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 КОДИРОВКА ПО УМОЛЧАНИЮ = latin1

3. Я не уверен, какую часть вы не понимаете. Я пытаюсь удалить записи из таблицы 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

Это работает, и это БЫСТРО!