[编辑]
目标是使用自连接基于顺序字段(sequentialsortfield)以特定顺序减去字段(somevalue)的值。查询按原样提供正确的结果,但是大数据集非常慢。使用mysql'explain'显示此查询不使用索引而是使用filesort,尽管所有三个示例字段都已编制索引。如果我删除'order by'它不再使用filesort [但]不会产生所需顺序的正确结果。
我搜索过并且没有看过任何有帮助的SO或MySQL文档。似乎无法避免在table1上using filesort
,除非我放弃order by
但我确实需要它。索引存在于所有三个字段中。
通过示例来说明我的问题。
“表格”的结构:
id INT
somevalue INT
sequentialsortfield INT
查询:
select table1.somevalue-table2.somevalue as PrevRowDiff
FROM table AS table1,
table AS table2
WHERE table1.sequentialsortfield+1 = table2.sequentialsortfield
order by id;
答案 0 :(得分:0)
试试这个:
Select table1.somevalue-table2.somevalue as PrevRowDiff
FROM table AS table1
Join table AS table2
on table1.sequentialsortfield+1 = table2.sequentialsortfield
group by sequentialsortfield
order by id;
答案 1 :(得分:0)
使这个查询有效是非常棘手的。简而言之,当你在sequentialsortfield
上有一个覆盖索引时,你需要强制MySQL以主键顺序输出数据(你无论如何都需要连接效率)。
我建议创建两个复合索引并尝试隐式强制其中一个:
说,
ALTER TABLE the_table ADD KEY the_one_to_force (id, sequentialsortfield, somevalue);
ALTER TABLE the_table ADD KEY usual_one (sequentialsortfield, somevalue);
并按如下方式重写查询(在这种情况下,您不需要ORDER BY):
SELECT t1.somevalue-t2.somevalue as PrevRowDiff
FROM the_table t1 FORCE INDEX (the_one_to_force)
JOIN the_table t2 ON t1.sequentialsortfield+1 = t2.sequentialsortfield
这个想法是,如果存在匹配,将按照the_one_to_force
索引和输出数据的顺序读取数据(因为它实际上发生了,但是MySQL优化器基于的选择适当的索引)查询)。