时间:2010-07-26 13:25:24

标签: mysql performance join inner-join

4 个答案:

答案 0 :(得分:1)

尝试使用子查询替换连接。 MySQL的优化器很糟糕;子查询通常比连接提供更好的性能。

答案 1 :(得分:0)

答案 2 :(得分:0)

首先,我质疑外部连接的使用,因为order by操作在rhs上,而左连接注入的NULL可能会对它造成严重破坏。

无论如何,加速此查询的最简单方法是pb.id_brand和pb.brand上的覆盖索引。这将允许使用连接条件“使用索引”评估订单。另一种方法是找到一些方法来减少传递给order-by的中间结果的大小。

但是,外连接,顺序和限制的组合让我想知道你究竟要查询的是什么,以及是否有更好的表达查询本身的方式。

答案 3 :(得分:0)

这个问题有些过时,但我确实找到了,其他人也是如此。

如果ORDER BY或GROUP BY包含连接队列中第一个表以外的表中的列,则Mysql使用临时。

所以你只需要使用STRAIGHT_JOIN来反转连接顺序,以绕过优化器发明的顺序:

SELECT STRAIGHT_JOIN pm.partnum, pb.brand_name
FROM products_brands AS pb 
RIGHT JOIN products_main AS pm ON pm.id_brand=pb.id_brand
ORDER BY pb.brand ASC 
LIMIT 0, 10

还要确保将max_heap_table_size和tmp_table_size变量设置为足以存储结果的数字:

SET global tmp_table_size=100000000;
SET global max_heap_table_size=100000000;

- 此示例中为100 MB。这些也可以在my.cnf配置文件中设置。