2013-08-29 4 views
0

В таблице предметов есть 30M строк. Я выполняю запрос, чтобы найти дубликат hash. hash определяется какПоиск дубликатов столбцов в таблице записей 30M

`hash` varchar(50) NOT NULL; 

Этот запрос

SELECT Count(*) 
FROM (SELECT Count(id) `num`, 
       `signature` 
     FROM `images` 
     WHERE `hash` IS NOT NULL 
     GROUP BY `hash` 
     HAVING `num` > 1) AS `count_table` 

занимает около 5-7 минут, прежде чем я нажал Ctrl+C, чтобы отменить запрос. Я запускаю его снова и все равно не могу дождаться этого много времени.

Как я могу получить этот результат быстрее?

Я знаю, что при выполнении группы это будет немного медленнее. Но8 минут слишком много, я думаю.

+1

У вас есть указатель на 'hash' или ... эээ ..' signature'? –

+0

Пожалуйста, опубликуйте структуру вашей таблицы –

ответ

1

Удостоверьтесь, что есть индекс на hash (или он signature?).

Заменить COUNT(id) на COUNT(hash) (или COUNT(signature)).

+0

У этого нет указателя. Я применил индекс и его намного быстрее. –

0

Если я правильно понял, вам нужны только возвращенные столбцы, которые дублируются? попробуйте это SELECT * FROM table_name AS t1 WHERE EXISTS (SELECT * FROM table_name AS t2 WHERE t1.hash = t2.hash и t1.id! = T2.id);

1

Если вам просто нужно количество повторяющихся записей, то вы можете попробовать

select count(*)-count(distinct hash) from images 
Смежные вопросы