2012-03-22 86 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 2012-03-22 16:38:04

+0

请显示两个查询。 – 2012-03-22 16:49:05

+0

是否总是3个选项或将它是动态的(不同的时间可以有更多或更少的“选项”值期待的。此外,不同的选项ID,预计将有条目数最少的。 – DRapp 2012-03-22 17:20:00

回答

1

尝试在option_idvalue创建多列索引。

+0

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, KEY'page_id'('page_id'), KEY'value'('value','option_id') )ENGINE = MyISAM;试过。结果是一样的。 – inwoker 2012-03-23 09:14:05