현재 Stack Overflow 주석의 데이터 덤프에 대해 일부 쿼리를 실행하려고합니다. 스키마는 다음과 같습니다.
CREATE TABLE `socomments` (
`Id` int(11) NOT NULL,
`PostId` int(11) NOT NULL,
`Score` int(11) DEFAULT NULL,
`Text` varchar(600) NOT NULL,
`CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`UserId` int(11) NOT NULL,
PRIMARY KEY (`Id`),
KEY `idx_socomments_PostId` (`PostId`),
KEY `CreationDate` (`CreationDate`),
FULLTEXT KEY `Text` (`Text`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
이 쿼리를 테이블에 대해 실행했으며 놀랍게도 느리게 실행되었습니다 (29 백만 행이 있지만 전체 텍스트 인덱스가 있음).
SELECT *
FROM socomments
WHERE MATCH (Text) AGAINST ('"fixed the post"' IN BOOLEAN MODE)
그래서 나는 그것을 프로파일 링했는데 그 결과는 다음과 같습니다.
|| Status || Duration ||
|| starting || 0.000058 ||
|| checking permissions || 0.000006 ||
|| Opening tables || 0.000014 ||
|| init || 0.000019 ||
|| System lock || 0.000006 ||
|| optimizing || 0.000007 ||
|| statistics || 0.000013 ||
|| preparing || 0.000005 ||
|| FULLTEXT initialization || 207.1112 ||
|| executing || 0.000009 ||
|| Sending data || 0.000856 ||
|| end || 0.000004 ||
|| query end || 0.000004 ||
|| closing tables || 0.000006 ||
|| freeing items || 0.000059 ||
|| logging slow query || 0.000037 ||
|| cleaning up || 0.000046 ||
보시다시피, FULLTEXT 초기화에 오랜 시간이 걸립니다. 이것이 정상입니까? 그렇지 않은 경우 어떻게 해결합니까?
id_group 2
및id_group 23
. 이를 통해 기본 테이블 내에서 검색하고 쿼리 범위를 2.000 ~ 2.999 및 23.000 ~ 23.999의 ID 범위로 제한하십시오. 물론 두 번째 키워드는 모든 키워드를 조합하여 새로운 키워드 조합을 만들면 필요에 따라 더 많은 결과를 얻을 수 있지만 결국 전체 속도를 높여야합니다. 물론 디스크 공간 사용량이 두 배가됩니다. 새로운 코멘트한다 CONCAT'ed 그룹 테이블에.