큰 MySQL InnoDB 테이블 (약 1 milion 레코드, 매주 300K 증가)을 블로그 게시물과 함께 보겠습니다. 이 테이블에는 색인이있는 URL 필드가 있습니다.WHERE에 대한 URL 대신 MD5 (URL)를 사용합니다.
새 레코드를 추가하면 같은 URL을 가진 기존 레코드를 확인하고 있습니다.
SELECT COUNT(*) FROM `tablename` WHERE url='http://www.google.com/';
현재 시스템은 초당 약 10 ~ 20 쿼리를 생성하고이 금액이 증가 될 것이다 : 여기에 같은 쿼리 모습입니다. URL의 MD5 해시 인 추가 필드를 추가하여 성능을 향상시킬 생각입니다.
SELECT COUNT(*) FROM `tablename` WHERE md5url=MD5('http://www.google.com/');
URL 필드에 비해 색인 길이가 더 짧고 일정한 길이로 표시됩니다. 너희들은 그것에 대해 어떻게 생각하니? 그것은 의미가 있습니까?
내 친구의 또 다른 제안은 MD5 대신에 CRC32를 사용하는 것이지만, CRC32의 결과가 얼마나 독특한 지 확신 할 수 없습니다. 이 역할에 대해 CRC32에 관해 어떻게 생각하는지 알려주십시오.
업데이트 : URL 열은 각 행마다 고유합니다.
"클러스터되지 않은"SQL Server 용어라고 생각했습니다. 단지 인덱스로만 읽으면 안됩니까? –
클러스터되지 않은 인덱스는 데이터의 "가상"인덱스이지만 클러스터 된 인덱스는 데이터의 실제 인덱스입니다. 테이블 당 클러스터 된 인덱스는 하나만 가질 수 있지만 동일한 테이블에 클러스터되지 않은 인덱스가 여러 개있을 수 있습니다. –
NC 인덱스는 MD5 또는 다른 해시를 추가하는 것과 동일하거나 유사한 성능을 얻습니다. url 당 tablename 레코드의 비율이 높으면 두 테이블 구조를 고려할 것입니다.이 테이블 구조에서는 tblUrls 및 tablename에 고유 URL 만 유지되고 해당 키만 저장됩니다. 이렇게하면 삽입 성능이 약간 향상되지만 저장 요구 사항이 줄어들 수 있고 기본 응용 프로그램에 따라 몇 가지 다른 이점이 있습니다. – mjv