我有一个MySQL查询,如下所示:
SELECT KeywordText, SUM(Frequency) AS Frequency FROM Keyword, Keyword_Polling_Frequency_Index
WHERE Keyword.KeywordText
IN ('deal', 'obama' and other keywords...)
AND RSSFeedNo IN (106, 107 and other RSS feeds)
AND PollingDateTime
BETWEEN '2011-10-28 13:00:00' AND '2011-10-28 13:59:00'
AND Keyword.KeywordNo = Keyword_Polling_Frequency_Index.KeywordNo
GROUP BY Keyword.KeywordText
ORDER BY Keyword.KeywordText ASC
查询中使用由涉及到两个表,是为了得到一个频率每小时批处理程序给定小时的RSS源列表中的关键字列表。 Keyword_Polling_Frequency_Index表具有KeywordNo,RSSFeedNo和PollingDateTime的组合主键。查询将该表加入到包含KeywordText的关键字表中。 column keywordText有一个MySQL MyISAM全文索引。
在测试中,发现它的性能令人满意,但现在开始运行非常缓慢并影响应用程序页面的交互速度。当我检查MySQL日志时,我发现MySQL正在创建临时表。
所以,我的问题是,鉴于此查询必须处理数十个RSS源中的几十个关键字来计算频率,任何人都可以提出优化吗?
我曾想过通过关键字打破查询,但我不相信这一点的实用性。
任何人都可以帮忙吗?
我正在使用MySQL Community Edition 5.X,并且上面显示了此查询的一个版本的EXTENDED EXPLAIN。
SQL为表如下:
CREATE TABLE `keyword` (
`KeywordNo` int(10) unsigned NOT NULL AUTO_INCREMENT,
`KeywordText` varchar(64) NOT NULL,
`UserOriginated` enum('TRUE','FALSE') NOT NULL,
`Active` enum('TRUE','FALSE') NOT NULL,
`UserNo` varchar(50) NOT NULL,
`StopWord` enum('TRUE','FALSE') NOT NULL,
`CreatedDate` date NOT NULL,
`CreatedTime` time NOT NULL,
PRIMARY KEY (`KeywordNo`),
FULLTEXT KEY `KEYWORDTEXT` (`KeywordText`)
) ENGINE=MyISAM AUTO_INCREMENT=44047 DEFAULT CHARSET=latin1$$
CREATE TABLE `keyword_polling_frequency_index` (
`KeywordNo` int(10) unsigned NOT NULL,
`RSSFeedNo` int(10) unsigned NOT NULL,
`PollingDateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Frequency` int(10) NOT NULL,
`Active` enum('TRUE','FALSE') NOT NULL,
`UserNo` varchar(50) NOT NULL,
PRIMARY KEY (`KeywordNo`,`RSSFeedNo`,`PollingDateTime`),
KEY `FK_keyword_polling_frequency_index_1` (`UserNo`),
CONSTRAINT `FK_keyword_polling_frequency_index_1` FOREIGN KEY (`UserNo`) REFERENCES `user` (`UserNo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
这是非常真实的。 –
已过帐表的SQL。 –
我认为最好为'(KeywordNo,PollingDateTime)'创建一个复合索引(顺序很重要) – Karolis