MySql数据范围查询优化

时间:2016-07-27 17:56:09

标签: mysql sql

我们有一个相当大的MySql Innodb表,其中包含以下类型的统计信息,

Rows - 8277943+                     Server Ram - 128 Gb
Avg row Length - 575                Processor - Deca Core Intel
Data Size - 4.4 GB                  Overall Database Size -  500Gb

问题是我们在这个表上有几个查询,它们现在运行速度非常慢,而且我的想法已经用完了。例如,下面给出了一些查询,

select  TIMESTAMPDIFF(SECOND,w.msgCreatedOn,now()) as rnge
from t_xxx_dtls w 
where  w.profileId=17901
   and w.orgId=1448
   and w.actionStartDate BETWEEN '2016-07-27 05:08:00' and '2016-07-27 13:08:59'
   and w.currentlyActive=true and w.`action` not in (6,9,17)   
   and (
     w.parentId NOT in (
       select CASE WHEN d.parentId IS NOT NULL THEN d.parentId ELSE d.id END as ticketId
       from t_xxx_dtls d  where  d.profileId=17901 and d.orgId=1448 and d.actionStartDate     BETWEEN '2016-07-27 05:08:00' and '2016-07-27 13:08:59' and d.action in (2,4,7)
       group by ticketId
     )
     or ( w.parentId is null and w.inReplyId is null)
   )
   and w.msgId is not null
order by rnge desc
limit 0,1

解释计划Explain Plan

虽然我们有一个简单的查询,如下面的一个,开始卡住,

select count(*)
from t_xxx_dtls d
where d.actionStartDate BETWEEN '2016-07-27 05:08:00' and '2016-07-27 13:08:59' 

根据解释计划,检查大量记录,如何改进。我正在阅读关于分区的内容,但现在确定这是否有用。

1 个答案:

答案 0 :(得分:0)

对于显示的第一个查询,我认为(orgId,profileId,actionStartDate)中的索引将是最有帮助的。

然而,它对于更简单的第二个查询没有帮助;那个人会从以actionStartDate开头的索引中受益。第一个查询也可以从这样的索引中受益,但我不确定当使用actionStartDate BETWEEN条件时,MySQL是否会使用(actionStartDate,orgId,profileId)索引的后半部分。