우리는 책을 분석하는 시스템을 구현하고 있습니다. 이 시스템은 PHP로 작성되었으며 각 책에 대해 단어를 반복하고 각각을 분석하여 다양한 정규 표현식 및 기타 테스트에서 특정 플래그 (데이터베이스 필드로 변환 됨)를 설정합니다. 이것은 matches
테이블 결과WHERE 절을 사용하여 MySQL (MyISAM) COUNTs 가속화
, 아래의 예와 유사한 생략 된 대부분의 필드
+------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | regex | varchar(250) | YES | | NULL | | | description | varchar(250) | NO | | NULL | | | phonic_description | varchar(255) | NO | | NULL | | | is_high_frequency | tinyint(1) | NO | | NULL | | | is_readable | tinyint(1) | NO | | NULL | | | book_id | bigint(20) | YES | | NULL | | | matched_regex | varchar(255) | YES | | NULL | | | [...] | | | | | | +------------------------+--------------+------+-----+---------+----------------+
는 tinyint
, 0 또는 1. 경기 테이블 (25 개) 필드는 현재이다.
성냥표에 ~ 2,000,000 개의 행이 있으며 약 500 권의 책을 분석하여 출력합니다. 그것은 각 쿼리가 필요로 주요 지수 보고서를 가져올 수 분 이상 소요 현재, 그러나
SELECT COUNT(*)
FROM matches
WHERE is_readable = 1
AND other_flag = 0
AND another_flag = 1
:
현재이 같은 matches
테이블을 쿼리 사이트의 "보고서"영역이있다 약 0.7 초. 쿼리 수준에서 캐싱 중이지만 초기 페이지로드에 너무 오래 걸립니다.
이처럼 데이터 세트를 관리하는 방법에 대해서는 경험이 많지 않으므로 누구나이 데이터를 저장하거나 쿼리하는 더 나은 방법을 알려줄 수 있습니까? 이 COUNT
의 성능을 향상시키기 위해 MySQL과 함께 사용할 수있는 최적화가 있습니까? 아니면 다른 데이터베이스 또는 데이터 구조를 사용하는 것이 더 좋습니까?
현재 MyISAM 테이블과 VPS와 함께 MySQL을 사용하고 있으므로 새로운 데이터베이스 시스템으로 전환하는 것은 문제가되지 않습니다.
무엇입니까 'SELECT [쿼리의 나머지 부분을] EXPLAIN'의 출력? – jcmeloni
@jcmeloni http://dpaste.com/690316/ –
Super; @Marek 및 다른 사람들이 설명한 솔루션에 대한 정확한 확인을 제공합니다. – jcmeloni