簡體   English   中英

慢速MySql查詢(優化LEFT OUTER JOIN)

[英]Slow MySql query (optimizing LEFT OUTER JOIN)

我有Mysql查詢,像這樣:

SELECT 
    Main.Code,
    Nt,
    Ss,
    Nac,
    Price,
    Ei,
    Quant,
    Dateadded,
    Sh,
    Crit,
    CAST(Ss * Quant AS DECIMAL (10 , 2 )) AS Qss,
    CAST(Price * Quant AS DECIMAL (10 , 2 )) AS Qprice,
    `Extra0`.`Value`
FROM
    Main
        LEFT OUTER JOIN
    `Extra_fields` AS `Extra0` ON `Extra0`.`Code` = `Main`.`Code`
        AND `Extra0`.`Nf` = 2
ORDER BY `Code`

查詢速度非常慢(大約10秒)。 沒有這一部分的查詢:LEFT OUTER JOIN Extra_fields AS Extra0 ON Extra0 Code = Main Code AND Extra0 Nf = 2很快。

有什么方法可以優化第一次查詢?

您想要在聯接表上添加索引以幫助通過Code和Nf查找值,然后添加Value列,以便它可以滿足選擇列表所需的列:

ALTER TABLE Extra_fields ADD KEY (Code, Nf, Value);

通過在Main.Code上添加索引,您可能會受益,這樣它就可以按排序順序讀取表,而無需執行文件排序:

ALTER TABLE Main ADD KEY (Code);

我對您的查詢運行了EXPLAIN並得到了以下信息:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: Main
   partitions: NULL
         type: index
possible_keys: NULL
          key: Code
      key_len: 5
          ref: NULL
         rows: 1
     filtered: 100.00
        Extra: NULL
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: Extra0
   partitions: NULL
         type: ref
possible_keys: code
          key: code
      key_len: 10
          ref: test.Main.Code,const
         rows: 1
     filtered: 100.00
        Extra: Using index

第一個表沒有文件排序。 我不得不使用...FROM Main FORCE INDEX(Code)...但這可能是因為我測試了表中沒有行。

第二張表顯示它正在使用僅索引訪問方法(“額外:使用索引”)。 我假設只引用了Extra_fields中的三列,而所有其他列都來自Main

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM