1

我有这个查询:

SELECT a.id, b.discount FROM (a LEFT JOIN b ON b.id_a = a.id);

此查询的 EXPLAIN 命令如下:

id  select_type   table  type   possible_keys   key       key_len  ref    rows   Extra
1    SIMPLE        a      index  NULL            PRIMARY   4        NULL   1489   Using index
1    SIMPLE        b      ALL    NULL            NULL      NULL     NULL   819   

A 是有 1489 行的表,B 是 SQL 视图。现在我明白了,MySQL 必须进行 1489*819 操作,这太不优化了。如果 B 是一个表,我将为列 id_a 创建一个索引,但我不知道如何处理 SQL 视图。

有人可以帮忙吗?

4

3 回答 3

2

我会查看视图,并尝试转到原始表来限定您关注的元素是否存在。并确保“b”视图的根表在该键上有一个索引。

于 2011-02-15T14:08:50.587 回答
0

您也可以尝试使用索引创建临时表,而不是使用视图(未索引)。我们对一些冗长的报告查询这样做了,结果得到了一些令人印象深刻的速度改进(当然是 YMMV)。

于 2011-02-15T14:12:45.473 回答
0

切换表格和视图可能会有所帮助。

例子:

SELECT a.id, b.discount FROM (b RIGHT JOIN a ON b.id_a = a.id);
于 2011-02-15T14:33:31.493 回答