我有以下查询:
SELECT ID FROM
`Article` this_ WHERE
(this_._Temporary_Flag = FALSE OR this_._Temporary_Flag = NULL) AND
this_.Published = TRUE AND
(this_.PublishedOn IS NULL OR this_.PublishedOn <= '2012-10-29 08:54:36') AND
(this_.Deleted = FALSE OR this_.Deleted = NULL) AND
(this_._ComputedDeletedValue = FALSE OR this_._ComputedDeletedValue = NULL) AND
((this_._TestItemSessionGuid IS NULL OR this_._TestItemSessionGuid = '')) AND
NOT (this_.CategoryId IS NULL)
AND (this_.PublishedOn < '2012-09-10 00:00:00' AND this_.CategoryId = 51118080)
ORDER BY this_.PublishedOn DESC LIMIT 1
确切地说,有问题的表包含 141,505 条记录。WHERE
我已经检查了子句中提到的索引和所有字段并被ORDER BY
索引(索引类型:INDEX,索引类型:BTREE)。
此查询第一次运行需要 40 秒。随后的运行时间缩短到 1 - 2 秒,我假设这是由于缓存造成的。如果我重新启动 MySQL 服务器,再次需要大约 40 秒。任何想法为什么它执行如此缓慢,以及可以完成的任何优化?
更新 1
数据库是 MySQL,表存储引擎是 InnoDb。
更新 2
作为旁注,此查询的范围是获取与当前文章相关的“上一篇文章”。我这样做是通过获取所有PublishedOn
字段小于当前字段的文章,按PublishedOn
降序排序并取第一个 1(我更新了 LIMIT,因为我最初输入了 50,而它应该是 1)。
其他条件是仅加载有效文章和同一类别的文章。
更新 3:解释输出
SelectType = Select
Type = index_merge
Possible_keys = CategoryId,PublishedOn,_TestItemSessionGuid,Deleted,_ComputedDeletedValue,_Temporary_Flag,Published Key = Deleted,_ComputedDeletedValue,_Temporary_Flag,Published,CategoryId
Key_Len = 1,1,1,1,9
ref = (NULL)
Rows = 3383
Extra = Using intersect(Deleted,_ComputedDeletedValue,_Temporary_Flag,Published,CategoryId); Using where; Using filesort ______