В Mysql у меня есть таблица с двумя столбцами (id, uuid). Затем я вставил в него 30 миллионов значений. (PS: UUID может повториться)
Теперь я хочу найти значение повторения в таблице с помощью грамматики Mysql, но sql потратил слишком много времени.
Я хочу выполнить поиск по всем столбцам, но это занимает много времени, поэтому я попытался запросить первый миллион строк, на это ушло 8 секунд.
Затем я попытался с 10 миллионами строк, это потратило 5 минут, затем с 20 миллионами строк сервер, кажется, умер.
select count(uuid) as cnt
from uuid_test
where id between 1
and 1000000
group by uuid having cnt > 1;
Любой может помочь мне оптимизировать SQL, спасибо
Попробуйте этот запрос,
SELECT uuid, count(*) cnt FROM uuid_test GROUP BY 1 HAVING cnt>1;
Надеюсь, поможет.
Часто самый быстрый способ найти дубликаты использует коррелированный подзапрос, а не агрегирование:
select ut2.*
from uuid_test ut2
where exists (select 1
from uuid_test ut2
where ut2.uuid = ut.uuid and
ut2.id <> ut.id
);
Это может использовать индекс uuid_test(uuid, id)
.