抱歉问了一个愚蠢的问题,我尝试在末尾使用 WHERE 子句和 ORDER 进行查询,这实际上需要很长时间才能实现,甚至认为 WHERE 子句在索引字段上。看起来 Mysql 首先对整个表执行 ORDER,然后再执行 SELECT,这不是首选行为。我对吗?我怎样才能让它先执行SELECT,然后执行ORDER。
谢谢!
附录:
mysql> explain SELECT *
FROM `products`
WHERE (`products`.user_id = 1111)
AND ( (`products`.`type` = 'type1' ) )
ORDER BY products.id DESC
LIMIT 1 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: products
type: ref
possible_keys: index_products_on_user_id, index_products_on_type
, index_products_on_type_and_status
key: index_products_on_user_id
key_len: 5
ref: const
rows: 2570
Extra: Using where; Using filesort
MySQL 文档中有一章是关于ORDER BY 优化的
我无法找到 MySQL 参考资料,但为了比较这里是SQL Server 逻辑查询处理阶段。SELECT 必须在 ORDER BY 之前完成。
没有代码,我猜你有不适合你正在运行的查询的索引
编辑,添加代码后
您可能需要一个索引
user_id, type, product_id DESC
来涵盖 WHERE 谓词和 ORDER BY:您当前没有合适的索引,因此filesort
会生成一个操作。此外,您有 SELECT * 需要额外的查找和处理才能获取所有列,无论使用什么索引(除非表只有 3 列)
gbn 提供的链接是一个很好的起点。传统上,在数据库中将自动执行的任何操作(存储过程、视图等)中使用 ORDER BY 并不是最佳实践——最终用户可能不会在这些地方使用数据。订购数据的最佳位置是在消费者使用的最终输出介质中。
例如,如果您使用的是 MSFT Reporting Services,请对您的报告而不是查询进行排序。当报告运行时,排序将发生在报告生成的呈现周期中,发生在数据已经收集之后。
我建议您的查询选择性不够,所以即使在
WHERE
未使用的字段上有索引......如果您发布查询和执行计划,您可能会得到更好的建议。