我有以下查询:
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 :EXPLAIN输出
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 ______
答案 0 :(得分:1)
确保您有(1) indexed your table fields
和(2) Partition table
,例如表格字段PublishedOn最适合partition by range
您可以参考
http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html了解更多详情。
答案 1 :(得分:0)
速度取决于表索引。 PublishedOn
列的设置索引。
之后也尝试优化表。
OPTIMIZE TABLE `Article`;