为什么查询不使用索引

时间:2013-09-26 14:37:01

标签: mysql indexing

我的查询

      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

2 个答案:

答案 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。

我希望它有所帮助!