【问题标题】:Slow MySql query (optimizing LEFT OUTER JOIN)MySql 查询慢(优化 LEFT OUTER JOIN)
【发布时间】:2017-01-28 15:28:16
【问题描述】:

我有 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 秒)。没有这部分的查询: 左外连接 Extra_fields AS Extra0 ON Extra0.Code = Main.Code AND Extra0.Nf=2 速度很快。

有没有办法优化第一个查询?

【问题讨论】:

  • 在 Code 和 Nf 列上创建所需的索引
  • 请为两张表提供SHOW CREATE TABLE

标签: mysql query-optimization


【解决方案1】:

您想在连接表上添加索引以帮助按 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

【讨论】:

  • 更好的是,Extra_fields,因为它闻起来像 EAV 类型架构,应该有 PRIMARY KEY(Code, Nf) 而没有 AUTO_INCREMENT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2013-03-14
  • 1970-01-01
相关资源
最近更新 更多