在几个字段和140k +记录上缓慢MySQL数据库查询

时间:2012-10-29 08:08:27

标签: mysql sql database database-performance

我有以下查询:

 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,_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 ______

2 个答案:

答案 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`;