0

私の質問

      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 の使用

4

2 に答える 2

0

あなたのクエリを見た後、私の提案は次のとおりです。

... AND SessionInfo.SessionCallTime BETWEEN '2013-08-01 00:00:00' AND '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 * FROM tmfInfo
INNER JOIN ANumber USING (ANumberLogID) INNER JOIN ANumberLog USING (ANumberLogID) ...

もちろん、FORCE INDEX を使用すると、クエリの時間を短縮できます。場合によっては、MySQL が最適な INDEX を選択しないことがあります。

それが役立つことを願っています!

于 2014-01-22T15:59:44.553 に答える