2012-03-22 5 views
1

다음과 같은 문제가 있습니다. 항목은 항목과 일치하는 항목이있을 때 0.0002 초 동안, 항목이없는 경우에는 0.0367 동안 실행됩니다.결과가 없을 때 쿼리가 너무 느리게 작동합니다.

CREATE TABLE IF NOT EXISTS `main_pages_options` (
    `page_id` int(11) NOT NULL, 
    `value` varchar(255) NOT NULL, 
    `option_id` int(11) NOT NULL, 
    UNIQUE KEY `page_id` (`page_id`,`option_id`), 
    FULLTEXT KEY `value` (`value`) 
) ENGINE=MyISAM ; 

SELECT page_id 
FROM main_pages_options 
    WHERE (option_id = 1 AND value = 'Test 1') 
    OR (option_id = 2 AND value = 'Test 2') 
    OR (option_id = 3 AND value = 'Test 3') 
GROUP BY page_id 
HAVING COUNT(*) = 3 

SELECT page_id 
FROM main_pages_options 
    WHERE (option_id = 1 AND value = 'Test 7') 
    OR (option_id = 2 AND value = 'Test 2') 
    OR (option_id = 3 AND value = 'Test 3') 
GROUP BY page_id 
HAVING COUNT(*) = 3 

main_pages_options에는 ~ 80,000 개의 항목이 있고 main_pages에는 ~ 20,000 개의 항목이 있습니다.

+0

'COUNT (*)'를 (COUNT (page_id)) (으)로 변경해 보셨습니까? 또한,'page_id' 컬럼에 AUTOINCREMENT 키를 두어야합니다. – Bojangles

+0

두 가지 쿼리를 표시하십시오. –

+0

항상 3 가지 옵션이 있거나 동적 일 수 있습니까? (다른 시간에는 더 많은 또는 더 적은 "옵션"값을 찾을 수 있습니다.) 또한 가장 많은 항목 수를 가질 것으로 예상되는 다양한 옵션 ID 중 – DRapp

답변

1

option_idvalue에 다중 열 색인을 만들어보십시오.

+0

'main_pages_options'이 (가) 존재하지 않으면 테이블을 만들려고합니다. (NULL), 'value' varchar (255) NOT NULL, 'option_id' int (11) NOT NULL, KEY'page_id' ('page_id'), KEY'value' ('value','option_id') ) ENGINE = MyISAM; 노력했다. 결과는 같습니다. – inwoker

관련 문제