MySQL에서 중복 블로브 행을 효과적으로 찾으려면 어떻게해야합니까?
-
11-07-2019 - |
문제
양식의 테이블이 있습니다
CREATE TABLE data
{
pk INT PRIMARY KEY AUTO_INCREMENT,
dt BLOB
};
Blob 열에는 약 160,000 개의 행과 약 2GB의 데이터가 있습니다 (블로브 당 14KB). 다른 테이블에는이 테이블에 외국 키가 있습니다.
3000 개의 얼룩과 같은 것이 동일합니다. 그래서 내가 원하는 것은 중복을 제거 할 수있는 Re Map 테이블을 줄 쿼리입니다.
순진한 접근 방식은 30-40k 행에서 약 1 시간이 걸렸습니다.
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에 대한 또 다른 인덱스를 구축함으로써 50k 행으로 약 24 초가 걸리는 직접 쿼리입니다.
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 초를 잃었습니다.
좋아요 질문을 위해 : 두 번째 선택보다 훨씬 나아질까요? 그렇다면 어떻게?
약간의 결론은 : 키 열이 매우 많이 사용되는 테이블이 있다면 나머지는 드물게 사용되지 않아야한다면, 그 테이블의 다른 결합을 추가하여 색인 스캔 대 전체를 장려하는 것이 더 나을 것입니다. 테이블 스캔?
#mysql@irc.freenode.net의 XGC fk
많은 도움이 될 수 있습니다. 트리거와의 재미와 최신 상태를 유지하는 것이 나쁘지 않을 수도있는 것.
제휴하지 않습니다 StackOverflow