首页 > 解决方案 > MySQL 优化器没有足够快地使用 ORDER BY

问题描述

我正在处理几个处理客户订单的表格。一张表包含订单的详细信息,另一张表包含运输信息。

我正在尝试选择从给定仓库运出的最新订单。这很简单:

SELECT oi.* FROM order_info oi
INNER JOIN order_shipping_info osi ON osi.order_info_id = oi.id
WHERE osi.warehouse_id = 5
ORDER BY oi.order_date DESC LIMIT 100;

但是,我遇到的问题是表中的行数比仓库数大很多。MySQL 确定没有必要在warehouse_id 列上使用索引,而是进行文件排序,它可以抓取150 万+ 行。

我会假设优化器将从对order_info表进行排序开始(因为 order_date 列已编入索引),然后从那里开始工作。这样,在最好的情况下,它会抓取它找到的前 100 行。

如果我删除 WHERE 子句,查询大约需要 50 毫秒才能运行。使用 WHERE 子句,它更接近 3 秒。

有没有办法可以强制 MySQL 首先执行 ORDER BY 而不是加入?

使用 MySQL 5.6

标签: mysqlsqlquery-performance

解决方案


推荐阅读