我们有一个相当大的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
虽然我们有一个简单的查询,如下面的一个,开始卡住,
select count(*)
from t_xxx_dtls d
where d.actionStartDate BETWEEN '2016-07-27 05:08:00' and '2016-07-27 13:08:59'
根据解释计划,检查大量记录,如何改进。我正在阅读关于分区的内容,但现在确定这是否有用。
答案 0 :(得分:0)
对于显示的第一个查询,我认为(orgId,profileId,actionStartDate)中的索引将是最有帮助的。
然而,它对于更简单的第二个查询没有帮助;那个人会从以actionStartDate开头的索引中受益。第一个查询也可以从这样的索引中受益,但我不确定当使用actionStartDate BETWEEN
条件时,MySQL是否会使用(actionStartDate,orgId,profileId)索引的后半部分。