MySQL에서 중복 블로브 행을 효과적으로 찾으려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/319860

  •  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 많은 도움이 될 수 있습니다. 트리거와의 재미와 최신 상태를 유지하는 것이 나쁘지 않을 수도있는 것.

도움이 되었습니까?

해결책

항상 해싱 함수를 사용할 수 있습니다 (MD5 또는 Sha1) 데이터의 경우 해시를 비교하십시오.

문제는 데이터베이스에 해시를 저장할 수 있는지 여부입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top