행이 30억 개가 넘는 큰 테이블이 있는데 이제 쿼리를 실행하는 데 3일이 걸립니다.
내 쿼리는 다음과 같습니다.
주파수 단어(단어, 빈도, 파일 이름)에 삽입 단어 선택, 빈도(*), 최대값(파일 이름) allwordstemp에서 단어별로 그룹화
기본적으로 내 쿼리는 allwordstemp 테이블에서 단어별로 그룹화하는 것이며 빈도가 1일 때 filename을 알고 싶습니다. 그래서 max(filename)을 추가했습니다. max와 같은 집계 함수에 포함됩니다. 빈도가 1보다 크면 filename 값도 필요하지 않습니다. 두 테이블 모두 단어와 파일 이름에 대해 2개의 인덱스를 가지고 있습니다.
allwordstemp 테이블(파일 이름은 id 파일입니다):
CREATE TABLE `allwordstemp`( `단어` varchar(45) DEFAULT NULL, `파일 이름` int(11) DEFAULT NULL, KEY `idx_allwordstemp_word`(`단어`), KEY `idx_allwordstemp_filename` (`파일 이름`) ) 엔진=InnoDB DEFAULT CHARSET=utf8;
주파수단어 테이블:
CREATE TABLE `주파수 단어`( `단어` varchar(45) DEFAULT NULL, `주파수` int(11) DEFAULT NULL, `파일 이름` int(11) DEFAULT NULL, KEY `idx_주파수단어_단어`(`단어`), KEY `idx_주파수단어_주파수`(`주파수`), KEY `idx_주파수단어_파일 이름`(`파일 이름`) ) 엔진=InnoDB DEFAULT CHARSET=utf8;
선택 설명:
+----+---------------+--------------- -+---+---------+---------------+------- ---- ------------+---------+------+------------+--- ---- ---+-------------+ | ID | 선택 가능 | 키 | 필터링 | +------+---------------+------------+--------------- -+-- ----+---------------+---------+-- -- -----+------+------------+----------+------------ -- + | 1 | 단순 | allwordstemp | idx_allwordstemp_word | +------+---------------+------------+--------------- -+-- ----+---------------+---------+-- -- -----+------+------------+----------+------------ -- +
검색어를 더 빠르게 만들려면 어떻게 해야 합니까?
필터가 단어나 파일 이름이 아닌 빈도를 기반으로 하는 것 같습니다. 그래서 먼저 모든 단어를 빈도별로 색인화하겠습니다.
그런 다음 빈도가 정수라고 가정하면 다음과 같이 WHERE 절을 추가합니다.
으아악위 내용은 다양한 파일 이름에서 한 번만 나타나는 모든 단어 목록을 제공합니다.
이 정보가 도움이 되기를 바라며 최선을 다하겠습니다!