【发布时间】:2017-04-30 16:27:13
【问题描述】:
我有一张桌子
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 子句需要这么长时间才能运行? 您对如何加快速度有什么建议吗?
编辑:
当我使用原来的索引运行解释语句时,我得到:img
当我使用@Simulant 建议的语句运行解释语句(将 o1 添加到索引中)时,我得到:img2
但是这个查询仍然需要很长时间才能执行。
【问题讨论】:
-
它可能在连接上单独为每一行运行 where 查询,即它正在执行数千个查询。
-
这种问题是糟糕设计的表现
-
尝试删除
o1上的索引。这可能会使优化器感到困惑。 -
@Strawberry 有关如何修复设计的任何建议?
-
任何时候你枚举了列(比如说2个以上),你可以确定你的设计是有缺陷的。我不知道 i 和 o 是什么,所以我无法进一步评论,但请参阅规范化。
标签: mysql database performance database-performance database-optimization