0

我有以下查询:

 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,_Tempo‌​rary_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 ______
4

2 回答 2

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了解更多细节。

于 2012-10-29T08:16:07.167 回答
0

速度取决于表索引。PublishedOn为列设置索引。之后也尝试优化表。

OPTIMIZE TABLE `Article`;
于 2012-10-29T08:35:51.490 回答