我的查询
SELECT Info.InfoID,
SessionInfo.SessionInfoID,
SessionInfo.ANI,
ANumber.ANumber,
tmfInfo.PTime,
tmfInfo.PTry,
SessionInfo.CardID,
tmfInfo.Status
FROM tmfInfo,
SessionInfo,
ANumber ,
ANumberLog,
ANumberGroup,
ANumberGroupLog
WHERE (tmfInfo.IVRSessionInfoID = SessionInfo.IVRSessionInfoID)
AND (SessionInfo.ANumberLogID = ANumber.ANumberLogID)
AND (ANumber.AccessNumberLogID = ANumberLog.ANumberLogID)
AND (ANumberrLog.ANumberGroupID = ANumberGroup.ANumberGroupID)
AND (ANumberGroup.ANumberGroupLogID = ANumberGroupLog.ANumberGroupLogID)
AND (SessionInfo.SessionCallTime >= '2013-08-01 00:00:00'
AND (SessionInfo.SessionCallTime <= '2013-08-01 23:59:59')
AND (ANumberLog.IsDeleted = '0')
AND (ANumberLog.IsActive = '1')
AND (ANumberGroupLog.IsDeleted = '0')
AND (ANumberGroupLog.IsActive = '1')
ORDER BY SessionInfo.SessionCallTime,tmfInfo.PTime DESC;
解释查询结果
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE DtmfInfo ALL SessionInfoID 1728919 Using temporary; Using filesort
1 SIMPLE SessionInfo eq_ref PRIMARY,SessionCallTime,ANumberLogID PRIMARY 8 IVRDtmfInfo.SessionInfoID 1 Using where
1 SIMPLE Anumber ref AnumberLogID AnumberLogID 5 SessionInfo.ANumberLogID 1 Using where
1 SIMPLE AnumberLog eq_ref PRIMARY,AcumberGroupID,IsActive,IsDeleted PRIMARY 4 SessionInfo.ANumberLogID 1 Using where
1 SIMPLE AnumberGroup eq_ref PRIMARY,ANumberGroupLogID PRIMARY 4 AnumberLog.ANumberGroupID 1
1 SIMPLE AnumberGroupLog eq_ref PRIMARY,IsActive,IsDeleted PRIMARY 4 Using where Using where Using where
我在SessionInfoID字段上有一个索引 查询DtmfInfo表不使用索引....
任何帮助/解释都会有所帮助。使用mysql 5.5.14
答案 0 :(得分:0)
我认为你必须使用FORCE INDEX:
查询将如下:
SELECT Info.InfoID, SessionInfo.SessionInfoID, SessionInfo.ANI, ANumber.ANumber, tmfInfo.PTime, tmfInfo.PTry, SessionInfo.CardID, tmfInfo.Status FROM tmfInfo FORCE INDEX ( index_name ) inner join SessionInfo on mfInfo.IVRSessionInfoID = SessionInfo.IVRSessionInfoID , ANumber , ANumberLog, ANumberGroup, ANumberGroupLog WHERE (SessionInfo.ANumberLogID = ANumber.ANumberLogID) AND (ANumber.AccessNumberLogID = ANumberLog.ANumberLogID) AND (ANumberrLog.ANumberGroupID = ANumberGroup.ANumberGroupID) AND (ANumberGroup.ANumberGroupLogID = ANumberGroupLog.ANumberGroupLogID) AND (SessionInfo.SessionCallTime >= '2013-08-01 00:00:00' AND (SessionInfo.SessionCallTime
答案 1 :(得分:0)
查看您的查询后,我的建议是:
您可以使用... AND SessionInfo.SessionCallTime BETWEEN '2013-08-01 00:00:00'和'2013-08-01 23:59:59'
我更喜欢在这部分使用JOINS: (SessionInfo.ANumberLogID = ANumber.ANumberLogID) AND(ANumber.AccessNumberLogID = ANumberLog.ANumberLogID) AND(ANumberrLog.ANumberGroupID = ANumberGroup.ANumberGroupID) AND(ANumberGroup.ANumberGroupLogID = ANumberGroupLog.ANumberGroupLogID)
修改如下:
SELECT *
来自tmfInfo
INNER JOIN ANumber USING(ANumberLogID)
INNER JOIN ANumberLog USING(ANumberLogID)
...
当然,FORCE INDEX可以减少查询的时间。有时,MySQL没有选择最好的INDEX。
我希望它有所帮助!