Как эффективно находить повторяющиеся строки больших двоичных объектов в MySQL?

У меня есть таблица формы

CREATE TABLE data
{
   pk INT PRIMARY KEY AUTO_INCREMENT,
   dt BLOB
};

Он имеет около 160 000 строк и около 2 ГБ данных в столбце большого двоичного объекта (в среднем 14 КБ на большой двоичный объект). В другой таблице есть внешние ключи в этой таблице.

Примерно 3000 одинаковых капель. Итак, мне нужен запрос, который даст мне таблицу повторной карты, которая позволит мне удалить дубликаты.

Наивный подход занял около часа на 30-40к строк:

SELECT a.pk, MIN(b.pk) 
    FROM data AS a 
    JOIN data AS b
  ON a.dt=b.dt
  WHERE b.pk < a.pk
  GROUP BY a.pk;

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

CREATE TABLE sizes
(
   fk INT,  // note: non-unique
   sz INT
   // other cols
);

Создавая индексы для fk и еще для sz, прямой запрос из этого занимает около 24 секунд с 50 тыс. Строк:

SELECT da.pk,MIN(db.pk) 
  FROM data AS da
  JOIN data AS db
  JOIN sizes AS sa
  JOIN sizes AS sb
  ON
        sa.size=sb.size
    AND da.pk=sa.fk
    AND db.pk=sb.fk
  WHERE
        sb.fk<sa.fk
    AND da.dt=db.dt 
  GROUP BY da.pk;

Однако при этом выполняется полное сканирование таблицы на da (таблица данных). Учитывая, что процент попаданий должен быть довольно низким, я бы подумал, что сканирование индекса было бы лучше. Имея это в виду, мы добавили 3-ю копию данных в качестве 5-го соединения, чтобы получить это, и потеряли около 3 секунд.

Хорошо, так что на вопрос: Собираюсь ли я стать намного лучше, чем второй выбор? Если да, то как?

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


Xgc на #[email protected] указывает, что добавление служебной таблицы, такой как размеры, но с уникальным ограничением для fk, может очень помочь. Немного повеселитесь с триггерами, а что нет, возможно, даже не так уж плохо, чтобы идти в ногу со временем.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
5
0
2 640
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы всегда можете использовать хеш-функцию (MD5 или SHA1) для своих данных, а затем сравнить хеши.

Вопрос в том, можно ли сохранить хеши в своей базе данных?

+1: Я согласен с этим. Если вам нужно делать байт для сравнения байтов каждый раз, когда запрос будет зависать. Убедитесь, что код, добавляющий записи, также хеширует их и генерирует хеши для всех существующих строк. Теперь вам нужно только сравнить размеры и хеши больших двоичных объектов.

Bork Blatt 26.11.2008 10:32

+1: кажется наиболее эффективным способом (по крайней мере, он сократит количество больших двоичных объектов, которые вам нужно сравнить.)

Shalom Craimer 16.02.2009 09:07

Другие вопросы по теме