MySQL 8.0 中 LIMIT 优化新特性使用场景及最佳实践 |
在 MySQL 查询优化中, 一、背景:LIMIT 与排序的索引选择困境在包含 但实际场景中,这种 “最优解” 可能适得其反:若排序索引与 例如,一张表同时存在主键索引(
在 MySQL 8.0.21 之前,这种索引选择行为无法通过参数干预,只能通过改写 SQL(如延迟关联)优化,灵活性较差 。 二、新特性:prefer_ordering_index 参数的作用MySQL 8.0.21 新增的
参数设置方式: -- 开启(默认) SET optimizer_switch = "prefer_ordering_index=on"; -- 关闭 SET optimizer_switch = "prefer_ordering_index=off"; 三、实践验证:参数对执行计划的影响1. 测试环境与数据准备
CREATE TABLE t ( id1 BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- 主键索引 id2 BIGINT NOT NULL, c1 VARCHAR(50) NOT NULL, c2 VARCHAR(50) NOT NULL, INDEX i (id2, c1) -- 联合索引(过滤字段id2) ); -- 插入测试数据 INSERT INTO t(id2, c1, c2) VALUES (1,'a','xfvs'), (2,'bbbb','xfvs'), (3,'cdddd','xfvs'), (4,'dfdf','xfvs'), (12,'bbbb','xfvs'), (23,'cdddd','xfvs'), (14,'dfdf','xfvs'), (11,'bbbb','xfvs'), (13,'cdddd','xfvs'), (44,'dfdf','xfvs'), (31,'bbbb','xfvs'), (33,'cdddd','xfvs'), (34,'dfdf','xfvs');
2. 参数开启时(默认行为)-- 确认参数状态 SELECT @@optimizer_switch LIKE '%prefer_ordering_index=on%'; -- 返回1(开启) -- 查看执行计划 EXPLAIN SELECT c2 FROM t WHERE id2>8 ORDER BY id1 ASC LIMIT 2G 执行计划关键信息:
问题:主键索引与 3. 参数关闭时(优化后)-- 关闭参数 SET optimizer_switch = "prefer_ordering_index=off"; -- 查看执行计划 EXPLAIN SELECT c2 FROM t WHERE id2>8 ORDER BY id1 ASC LIMIT 2G 执行计划关键信息:
优势:通过过滤性更好的 四、适用场景与最佳实践
五、总结MySQL 8.0 引入的 随着 MySQL 优化器的不断进化,这类参数的出现体现了从 “自动最优” 到 “可控优化” 的趋势 。掌握这类特性,能帮助开发者在复杂业务场景中更精准地提升查询性能,避免因优化器的 “想当然” 导致的性能陷阱 。 到此这篇关于MySQL 8.0 中 LIMIT 优化新特性 的文章就介绍到这了,更多相关mysql limit优化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持! |