用笛卡尔连接优化sql查询

时间:2016-05-04 20:16:44

标签: mysql sql query-optimization

我有2张桌子sl和sd。

如果可能的话,我想优化以下查询

select sl.*, sd.* from sl join sd where sl.conf_id='blah' and sd.for_as=1

我的理解是首先执行笛卡尔积,然后进行滤波。

有没有办法先完成过滤?

1 个答案:

答案 0 :(得分:0)

运行EXPLAIN SELECT ... - 它可能会说"使用连接缓冲区"。这是将一个表加载到内存中(如果不是太大)并重复扫描它以获取数据的位置。不是一个漂亮的网站,但比“加入缓冲区”之前要快得多。发挥了作用。

由于你没有ONWHERE将两张桌子绑在一起,你真的想要"交叉连接"?也就是说,如果有40个'等等。和70' 1',你最终会得到40 * 70 = 2800行?

对于优化,优化器将选择其中一个表,优先选择具有有用索引的表,扫描它(索引或表),然后重复使用连接缓冲区(如果可能)进行扫描(索引或表)另一个。

换句话说,如果可能,一个表将使用索引,在笛卡尔积之前进行过滤,另一个表可能使用连接缓冲区。如果表格不是太大,表现就不会太糟糕。