【发布时间】:2012-01-28 01:38:20
【问题描述】:
我有一个按 HomeId 的电话事件表。每行都有一个 EventId(挂机、摘机、响铃、DTMF 等)、TimeStamp、Sequence(自动递增)和 HomeId。我正在进行查询以查找特定类型的事件(即入站或出站呼叫)和持续时间。
我曾计划在此表上使用多重自联接来挑选通常表明一种或另一种发生类型的事件序列。 EG 入站呼叫将是一段时间不活动,然后没有 DTMF,然后响铃和呼叫者 ID(可能),然后摘机。我会找到下一个挂机并因此有持续时间。
我的表由 HomeId、EventId 和 Sequence 编制索引,并且有大约 6 万条记录。当我对我的查询进行“解释”时,它会显示索引和 75、75、1、1、748 的行数。似乎很可行。但是当我运行查询时,它需要超过 10 分钟(此时 MySQL 查询浏览器超时)。
查询外呼:
select pe0.HomeId, pe1.Stamp, pe1.mSec, timediff( pe4.Stamp, pe0.Stamp ) from Phone_Events pe0
join Phone_Events pe1 on pe0.HomeId = pe1.HomeId and pe1.Sequence = pe0.Sequence - 1 and abs(timediff( pe0.Stamp, pe1.Stamp )) > 10
join Phone_Events pe2 on pe0.HomeId = pe2.HomeId and pe2.Sequence = pe0.Sequence + 1 and pe2.EventId = 22
join Phone_Events pe4 on pe4.HomeId = pe0.HomeId and pe4.EventId = 30 and pe4.Stamp > pe0.Stamp
where pe0.eventId = 12 and pe0.HomeId = 111
AND
NOT EXISTS(SELECT * FROM Phone_Events pe3
WHERE pe3.HomeId = pe0.HomeId
AND pe3.EventId not in( 13, 22 )
AND pe3.Stamp > pe0.Stamp and pe3.Stamp < pe4.Stamp );
有没有什么特定于自我加入的东西让这个速度变慢?有没有更好的方法来优化这个?杀手似乎是“不存在”部分 - 这部分是为了确保在最后一个“挂机”和当前“摘机”之间没有事件。
编辑:EventId 如下:
'1', 'device connection'
'2', 'device disconnection'
'3', 'device alarm'
'11', 'ring start'
'12', 'off hook'
'13', 'hang up(other end)'
'15', 'missed call'
'21', 'caller id'
'22', 'dtmf'
'24', 'device error'
'30', 'on hook'
'31', 'ring stop'
【问题讨论】:
-
看起来 Stamp 上的索引会有所帮助
-
主键是(Sequence, Home)。 (Sequence, Home), EventId 和 HomeId 上也有索引。
-
abs(timediff( pe0.Stamp, pe1.Stamp ))
-
我的东西可以在这里杀死我们。每个 HomeId 在 Phone_Events 中有多少条记录?我们能看到相关表和列的架构,包括索引吗?
标签: mysql optimization join