Быстрое удаление дубликатов из большой базы MySQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

SQL
Скопировать код
CREATE TABLE table_no_dupes AS
SELECT DISTINCT * FROM original_table;
RENAME TABLE original_table TO old_table,
           table_no_dupes TO original_table;

В этом подходе используются операторы DISTINCT, чтобы избавиться от дубликатов, и RENAME для быстрой переименовки таблиц с минимальной задержкой. Не забывайте сделать резервную копию и модифицировать запрос с DISTINCT в зависимости от ситуации.

Кинга Идем в IT: пошаговый план для смены профессии

Углубляемся в стратегии эффективного удаления дубликатов

Использование уникальных свойств для обхода ловушек GROUP BY и DISTINCT

При обработке больших объемов данных применение GROUP BY или SELECT DISTINCT может вызвать неоправданно длительные операции. Вместо этого нужно найти метод, способный эффективно обрабатывать больше данных.

Применение уникальных ограничений для быстрого удаления дубликатов

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

SQL
Скопировать код
ALTER IGNORE TABLE original_table
ADD UNIQUE INDEX idx_unique (text1, text2);

Теперь выражение ALTER в переводе звучит примерно так: «Я не могу тебя игнорировать, ведь ты уникален!» 😉

Отображение не-NULL значений с помощью INSERT ON DUPLICATE KEY UPDATE

Иногда полезные данные могут быть скрыты среди NULL в дублированных строках. Важно придать приоритет не-NULL значениям. Вот метод делается с помощью функций IFNULL() и INSERT INTO ... ON DUPLICATE KEY UPDATE:

SQL
Скопировать код
INSERT INTO table_no_dupes (text1, text2, text3)
SELECT text1, text2, IFNULL(text3, 'default value')
FROM original_table
ON DUPLICATE KEY UPDATE text3 = VALUES(text3);

Используя этот метод, мы отсеиваем NULL значения, словно говорим: «Спасибо, NULL, но твои услуги больше не пригодятся!» 😅

Временные таблицы и аспекты производительности

MySQL может использовать алгоритм filesort для управления временными таблицами большого объема. Это необходимо, но процесс можно оптимизировать за счет добавления индексов на соответствующие столбцы.

Визуализация

Дубликаты в базе данных можно ассоциировать с ненужными ингредиентами в пицце:

Markdown
Скопировать код
Ваша пицца (🍕🧀🧀🌶️🧀🍅🍄)

Лишние компоненты – это ИЗБЫТОК СЫРА (🧀🧀)

Вы стремитесь к СБАЛАНСИРОВАННОМУ НАБОРУ каждого ингредиента (🧀)

Как убрать лишний сыр, оставив оптимальное количество:

SQL
Скопировать код
DELETE t
FROM my_pizza t
JOIN (
  SELECT MIN(id) as min_id
  FROM my_pizza
  GROUP BY topping
  HAVING COUNT(*) > 1
) extra_cheese ON t.topping = extra_cheese.topping AND t.id > extra_cheese.min_id;

Результат – идеальное сочетание ингредиентов:

Markdown
Скопировать код
Пицца до: [🍕🧀🧀🌶️🧀🍅🍄]
Пицца после:  [🍕🧀🌶️🍅🍄]

Совершенное равновесие! 🚀

Прогрессивные способы оптимизации удаления дубликатов

Обеспечение уникальности с помощью INSERT IGNORE

С помощью команды INSERT IGNORE можно без лишних звонков отвергнуть строки, которые могли бы вызвать дублирование уникальных записей в индексе:

SQL
Скопировать код
INSERT IGNORE INTO temp_table
SELECT * FROM original_table;

Так дубликаты как бы исчезают. Магия, ни много ни мало! 🎩🐇

Пакетное удаление для повышения производительности

Пакетное удаление дубликатов, особенно с использованием индексированного столбца, может оказаться эффективнее, чем удалять их по отдельности:

SQL
Скопировать код
DELETE original FROM original_table AS original
JOIN (
  SELECT MAX(id) AS max_id
  FROM original_table 
  GROUP BY unique_column 
  HAVING COUNT(unique_column) > 1
) dup ON original.id = dup.max_id;

Это похоже на кнопку «Удалить дубликаты» для вашей базы данных.

Индексы: добавление и удаление для повышения производительности

Важно умело управлять индексами. Правильно расставленные индексы перед удалением дубликатов могут улучшить производительность запроса. Удаление ненужных индексов после дедупликации поможет предотвращать спад производительности при выполнении обычных операций.

Полезные материалы

  1. MySQL :: MySQL 8.0 Руководство по ссылке :: 13.2.2 Заявление об удаленииофициальное руководство по работы с DELETE в MySQL.
  2. Как удалить повторяющиеся строки в SQL Server? – Stack Overflowсоветы экспертов сообщества по удалению дубликатов, применимы и для MySQL.
  3. MySQL :: MySQL Workbenchграфический пользовательский интерфейс от MySQL, помогающий в управлении данными и удалении дубликатов.