나는 3 개의 칼럼과 2,300 만 개의 칼럼을 가진 테이블을 가지고있다. 각 단일 행에는 기본 키, int 값 및 "하나의 단일"단어가 포함됩니다. 각 단어의 길이는 3 자입니다. 즉, 각 단어의 "해시 표현"이있었습니다. 표 크기는 5GB였습니다. 이 테이블은 색인이 잘 붙어 있습니다.MySQL 쿼리 속도는 테이블 크기에 달려 있습니까?
이제 실제 단어가 포함 된 동일한 테이블을 만들겠습니다. 더 이상 3 자의 해시는 없습니다. 따라서 각 단어에는 정상적인 문자 수가 포함됩니다. 이제이 표에는 2,300 만 개의 행과 3 개의 열이 있습니다. 그러나 단어의 길이가 3 자의 해시보다 많기 때문에 표의 크기는 15GB입니다. 이 테이블은 색인이 잘 붙어 있습니다.
두 테이블의 유일한 차이점은 첫 번째 테이블에서 Hash
의 데이터 형식이 char(3)
입니다. 이제 두 번째 테이블에서 "non_hashed_word"의 데이터 유형은 varchar(20)
입니다.
이제 내가 언급 한 이전 표에서 실행 한 아래 코드를 살펴보십시오. 이 코드는 0.01 초 실행됩니다.
SELECT `indexVal`, COUNT(`indexVal`) AS OverlapWords, `UniqueWordCount`,
(COUNT(`indexVal`)/`UniqueWordCount`) AS SimScore FROM `key_word`WHERE `hashed_word` IN
('001','01v','0ji','0k9','0vc','[email protected]','0%d','13#' ,'148'
,'1e1','1sx','1v$','[email protected]','1?b','1?k','226','2kl','2ue','2*l','2?4','36h','3au','3us','4d~')
GROUP BY (`indexVal`) LIMIT 500
새 테이블에서도 동일한 코드를 실행할 것으로 예상됩니다.
내 질문에, 행의 개수와 열의 수가 같더라도 테이블 크기가 훨씬 더 크기 때문에 우리 쿼리를 사용할 수 있습니까? 아니면 데이터 유형이 varchar()
일까요?
요약하면 간단합니다. EXPLAIN을 사용하여 인덱스를 올바르게 실행했는지 확인하십시오. 또한 "filesort 사용"을 찾습니다. http://www.mysqlperformanceblog.com/2009/03/05/what-does-using-filesort-mean-in-mysql/ – bcmcfc
두 번째 인덱스의 메모리가 충분하다면 테이블이 메모리에 맞게 또한 빠를 것입니다. (ish) – Mihai
테이블이 잘 색인되어 있으므로 사용중인 것이 무엇이든간에 hashed_word/nonhashed_word라고 가정하면 색인이 생성됩니다. 내가 그걸 알게 해줘. 이 필드의 문자 크기와 테이블의 ibd 크기는 무엇이며 인덱스 크기는 무엇입니까? 제한 조건을 사용하려고하는 이유는 한계 조건이 없도록 조건을 계산하려고 할 때 여기에서 작동해서는 안되기 때문입니다. ... 한 번 제한 클론을 제거하고 필요한 세부 사항을 공유 할 수 있습니다. –