【问题标题】:mySQL Query Optimization (LEFT JOIN & SUBQUERY)mySQL 查询优化(LEFT JOIN 和 SUBQUERY)
【发布时间】:2012-08-07 17:50:34
【问题描述】:
SELECT table1.waypoint,table1.latitude,
       table1.longitude,table1.airway
FROM 
  airways table1
JOIN 
   (SELECT * FROM airways
    WHERE waypoint='KORED') AS table2
  ON table1.airway = table2.airway 
WHERE table1.sequence=table2.sequence+1 
   OR table1.sequence=table2.sequence-1

你好,

我正在尝试优化上述查询。目前查询时间相当长(大约 0.9 秒)。我只使用一个表(约 100k 个条目),将其与自身连接。 IN 语法在我的 Synology MYSQL 5.1 中不起作用。 (不知何故,使用SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2); 使其崩溃。不使用 WHERE 部分的查询时间约为 0.2 秒。我已在 sequencewaypoint 上为表编制索引。

谢谢!

【问题讨论】:

  • 您能否通过将EXPLAIN 放在该查询前面并运行它并在此处发布输出来显示查询执行计划?
  • 这是你正在做的数学运算,一旦你说 X = Y+1,你基本上会杀死任何索引,因为它必须对每一行进行数学运算。我建议向表中添加几个字段,将它们命名为 sequence_increment、sequence_decrement 或类似的名称,然后存储这些值,在这些列上建立索引,您应该会看到很大的改进。
  • 在 phpMyadmin 中查询显示(使用 EXPLAIN)。 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 4 1 PRIMARY table1 ALL sequence NULL NULL NULL 87850 Range checked for each record (index map: 0x4) 2 DERIVED airways ref waypoint waypoint 18 3 在哪里使用。我将尝试“添加字段”选项。但是如果有针对该问题的 SQL 解决方案会更容易。
  • 航空公司表上有哪些索引?看起来你在场上没有一个 airway 这可能会产生很大的不同
  • 你是我的英雄,做到了,低至 0.0087 秒。非常感谢!

标签: mysql optimization join subquery


【解决方案1】:

不确定这是否会像我建议的那样将这些字段实际添加到表本身并对其进行索引,但您可以尝试将数学从 where 移到 select 中:

SELECT table1.waypoint,table1.latitude,
       table1.longitude,table1.airway
FROM 
  airways table1
JOIN 
   (SELECT *,sequence + 1 as sequence_inc, sequence - 1 as sequence_dec FROM airways
    WHERE waypoint='KORED') AS table2
  ON table1.airway = table2.airway 
WHERE table1.sequence=table2.sequence_inc
   OR table1.sequence=table2.sequence_dec

编辑 好的,这无济于事,但根据您的解释,我认为真正的问题是您用来加入的气道表的气道字段缺少索引。添加该索引,看看是否可以提高您的性能。

【讨论】:

  • 我试过那个,也需要0.9s左右。还有其他想法如何改进该查询吗?您可能知道为什么“IN”语句会停止数据库吗?拆分查询是一个合理的选择吗?
  • 如果您执行 IN (select ...),mySQL 将为外部表中的每一行运行该子查询。我不确定你所说的拆分查询是什么意思。
  • OK 所以“IN”不是一个选项。通过拆分它,我考虑只使用查询的一部分并将值存储在脚本中,并使用在其他查询中接收到的数据。
  • 我明白了,调用多个查询是一种选择,但我认为您希望尽可能限制往返数据库。
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 2014-05-23
  • 2015-09-23
  • 2016-05-27
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2011-02-14
相关资源
最近更新 更多