【发布时间】: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 秒。我已在 sequence 和 waypoint 上为表编制索引。
谢谢!
【问题讨论】:
-
您能否通过将
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