2017-01-28 134 views
0

我有MySQL查询,像这样:(约10秒)慢MySQL查询(优化LEFT OUTER JOIN)

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` 

查询是很慢的。没有这个零件的查询: LEFT OUTER JOIN Extra_fields AS Extra0 ON Extra0Code = MainCode AND Extra0Nf = 2 很快。

有什么方法可以优化第一个查询吗?

+0

在Code和Nf列上创建必需的索引 – GurV

+0

谢谢,它有帮助。 –

+1

请为这两个表提供'SHOW CREATE TABLE'。 –

回答

1

要在连接表以帮助代码和NF查找值增加一个索引,然后添加值列,以便它能够满足你需要选择列表列:

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:Using index”)。我假设只有Extra_fields的三列被引用,而其他所有列都是从Main

+1

更好的是,'Extra_fields',因为它闻起来像EAV类型的模式,应该有'PRIMARY KEY(Code,Nf)'和'AUTO_INCREMENT'。 –