答案 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配置文件中设置。