首页 > 解决方案 > 任何人都可以告诉我为什么我的查询需要永远运行吗?

问题描述

谁能告诉我为什么我的查询需要永远运行?我想确保我的查询没有任何问题会减慢进程。

 WITH TradeIn AS 
    (
        SELECT  CONVERT(ID.DateCreated, DATE) 'Invoice Date' , ID.InvoiceIDByStore ,
                ID.InvoicedAt , ID.EmployeeName , ID.TenderedBy , ID.CustomerName ,
                ID.ProductIdentifier , ID.ProductName , ID.SerialNumber ,
                ID.Quantity , ID.TotalPrice
            FROM  simplymacstaging.productdetail ID
            LEFT JOIN  simplymacstaging.productmasterlist PM 
                  ON PM.ProductSKU = ID.ProductIdentifier
            WHERE  CONVERT(ID.DateCreated, DATE) >= '2014-01-01'
              AND  CONVERT(ID.DateCreated, DATE) <= '2014-12-31'
              AND  ID.InvoicedAt IN ('100 Park City', '101 Orem', '102 Fort Union',
                        '105 St. George', '106 Foothill'
                          )
              AND  DefaultVendorName IN ('Simply Mac Trade In', 'Phobio')
              OR  ProductIdentifier IN ('ISATNS000001','ISATRB000003',
                        'ISPHNR000007','COMINS001595','COMIRB001597','ISPHNS000003',
                        'COMINS001415','ISPHRB000004','COMIRB001416','ISPHTL000006',
                        'IABUAP000004','IABUAP000003','MIMICE000035','MIMICE000426',
                        'MIMICE000427','IABUAP000006','COMIAP000007','COMICE000011')
    ) 
SELECT  *
    FROM  simplymacstaging.productdetail PD
    INNER JOIN  TradeIn TD  ON TD.InvoiceIDByStore = PD.InvoiceIDByStore
    WHERE  CONVERT(PD.DateCreated, DATE) >= '2014-01-01'
      AND  CONVERT(PD.DateCreated, DATE) <= '2014-12-31'

知道如何改进或使其更快吗?

太感谢了

标签: mysqlquery-optimizationmysql-workbench

解决方案


  • OR通常会阻止使用任何索引。
  • 不要将日期转换为DATE- 我假设DateCreated已经是DATEor DATETIME,如果没有CONVERT().
  • 摆脱CONVERT, INDEX(InvoiceIDByStore, DateCreated)onPD可能会有很大帮助。
  • 请提供SHOW CREATE TABLE,以便我们查看您是否有合适的索引。
  • 请限定所有列名(使用时JOIN),以便我们知道它们在哪个表中(例如DefaultVendorName:)
  • 请提供EXPLAIN
  • 我认为没有必要WITH;似乎大SELECTWITH可以变成一个“派生表”。EXPLAIN看看是否保持不变会很有趣。

推荐阅读