gpt4 book ai didi

mysql - 优化缓慢的 MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 00:52:17 25 4
gpt4 key购买 nike

enter image description here

我有一个 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 的复合主键。查询将此表连接到包含关键字文本的关键字表。 column keywordText 有一个 MySQL MyISAM 全文索引。

在测试中发现这表现令人满意,但现在开始运行非常缓慢并影响应用程序页面的交互速度。当我查看 MySQL 日志时,我发现 MySQL 正在创建临时表。

所以,我的问题是,鉴于此查询必须处理数十个 RSS 提要中的数十个关键字来计算频率,任何人都可以提出优化建议吗?

我曾考虑过按关键字拆分查询,但我不相信这样做的实用性。

有人能帮忙吗?

我正在使用 MySQL Community Edition 5.X,上面显示了此查询版本的扩展说明。

表的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$$

最佳答案

如前所述,也按照提到的顺序向 PollingDateTime 字段添加索引。这是我的建议:

SELECT 
K.KeywordText,
SUM(F.Frequency) AS Frequency
FROM
Keyword K, Keyword_Polling_Frequency_Index F
WHERE
EXISTS
(
SELECT 1
FROM Keyword K1
WHERE
MATCH K1.KeywordText AGAINST ('deal obama "another keyword" yetanother' IN BOOLEAN MODE)
AND K1.KeywordNo = K.KeywordNo
)
AND K.KeywordNo = F.KeywordNo
AND F.PollingDateTime BETWEEN '2011-10-28 13:00:00' AND '2011-10-28 13:59:00'
AND F.RSSFeedNo IN (106, 107, 110)
GROUP BY K.KeywordText
ORDER BY K.KeywordText ASC

这可能会减少用于比较(SQL inside-out 解析)的记录数,而不是直接匹配两个表(N x N)。

关于mysql - 优化缓慢的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7939293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com