我有2张桌子sl和sd。
如果可能的话,我想优化以下查询
select sl.*, sd.* from sl join sd where sl.conf_id='blah' and sd.for_as=1
我的理解是首先执行笛卡尔积,然后进行滤波。
有没有办法先完成过滤?
答案 0 :(得分:0)
运行EXPLAIN SELECT ...
- 它可能会说"使用连接缓冲区"。这是将一个表加载到内存中(如果不是太大)并重复扫描它以获取数据的位置。不是一个漂亮的网站,但比“加入缓冲区”之前要快得多。发挥了作用。
由于你没有ON
或WHERE
将两张桌子绑在一起,你真的想要"交叉连接"?也就是说,如果有40个'等等。和70' 1',你最终会得到40 * 70 = 2800行?
对于优化,优化器将选择其中一个表,优先选择具有有用索引的表,扫描它(索引或表),然后重复使用连接缓冲区(如果可能)进行扫描(索引或表)另一个。
换句话说,如果可能,一个表将使用索引,在笛卡尔积之前进行过滤,另一个表可能使用连接缓冲区。如果表格不是太大,表现就不会太糟糕。