MySql查询耗时太长

时间:2017-04-30 16:27:14

标签: mysql database performance database-performance database-optimization

我有一张桌子

CREATE TABLE temp (
    i1 DECIMAL(10, 5),
    i2 DECIMAL(10, 5),
    i3 DECIMAL(10, 5),
    i4 DECIMAL(10, 5),
    i5 DECIMAL(10, 5),
    i6 DECIMAL(10, 5),
    i7 DECIMAL(10, 5),
    i8 DECIMAL(10, 5),
    i9 DECIMAL(10, 5),
    o1 DECIMAL(10, 5),
    o2 DECIMAL(10, 5),
    o3 DECIMAL(10, 5),
    o4 DECIMAL(10, 5),
    o5 DECIMAL(10, 5),
    o6 DECIMAL(10, 5),
    o7 DECIMAL(10, 5),
    o8 DECIMAL(10, 5),
    o9 DECIMAL(10, 5)
); 
CREATE INDEX input_data_index
ON temp (i1, i2, i3, i4, i5, i6, i7, i8, i9);
CREATE INDEX test_index
ON temp (o1); 

我正在尝试使用此查询搜索此表:

SELECT * FROM temp t
INNER JOIN temp x
ON t.i1 = x.i1 
AND t.i2 = x.i2
AND t.i3 = x.i3
AND t.i4 = x.i4
AND t.i5 = x.i5
AND t.i6 = x.i6
AND t.i7 = x.i7
AND t.i8 = x.i8
AND t.i9 = x.i9
WHERE t.o1 != x.o1; 

该表包含180,362行。如果我取出where子句,它只需要0.157秒就可以运行但是使用where子句需要很长时间才能运行(超过300秒),此时我就取消它。

为什么在添加where子句时运行需要这么长时间? 您对我如何加快速度有任何建议吗?

编辑:

当我使用原始索引运行explain语句时,我得到了img

当我使用@Simulant建议的解释语句(将o1添加到索引)时,我得到:img2

但这个查询执行的时间仍然很长。

3 个答案:

答案 0 :(得分:0)

如果你想要值o1,其中i值相同,你可以考虑:

select i1, i2, i3, i4, i5, i6, i7, i8, i9,
       group_concat(o1)
from temp
group by i1, i2, i3, i4, i5, i6, i7, i8, i9;

这与结果集不完全相同,但它可能满足您的需求。

答案 1 :(得分:0)

i1, i2, i3, i4, i5, i6, i7, i8, i9在同一索引中编入索引,因此索引可以完全使用没有where的查询。您的列o1已在另一个索引中编入索引。但是查询一次只能为一个表使用一个索引。您应该做的是将查询所需的所有列添加到同一索引。

CREATE INDEX input_data_index
ON temp (i1, i2, i3, i4, i5, i6, i7, i8, i9, o1);

使用explain语句可以帮助您了解索引减少扫描行的效果。

答案 2 :(得分:0)

有无

INDEX((i1, i2, i3, i4, i5, i6, i7, i8, i9,  o1)

将WHERE子句更改为

WHERE t.o1 > x.o1; 

这将减少输出行数的一半,可能改变查询的执行方式。