使用不同的位置和顺序优化MySQL自连接查询

时间:2013-10-23 19:11:40

标签: mysql

[编辑]

目标是使用自连接基于顺序字段(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;

2 个答案:

答案 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优化器基于的选择适当的索引)查询)。