MySQL查询优化器参数prefer_ordering_index有什么作用?
- 内容介绍
- 文章标签
- 相关推荐
一句话。 哎呀, 今天要跟你聊聊这个叫prefer_ordering_index的参数,别看它名字很长,其实就是让MySQL在做排序的时候更偏爱用索引的一个小把戏。你以为这玩意儿就那么简单?不不不我可得把它拆开来好好说说。
先给你来个“开场白”
你想想看, 写个SQL: SELECT * FROM orders WHERE status='shipped' ORDER BY create_time DESC LIMIT 10; 如果没有优化器帮忙, ICU你。 MySQL可能会先把所有满足status=‘shipped’的行找出来然后再排个序。这里面就有两件事: - 扫索引 - 排序

而prefer_ordering_index这个参数, 就是告诉优化器:“嘿,优先考虑能直接按顺序读出来的索引。”如果你把它打开, 优化器就会尽量去找能支持ORDER BY字段的索引;如果你关掉,它会更关注WHERE条件的选择性,用最少扫描的数据来先过滤,再排序。
为什么这么重要?
主要原因是在实际业务里经常会遇到“高过滤性+排序”的场景。比如电商平台上要分页显示已发货订单,或者日志系统要统计最近7天每个IP登录次数。这种场景里 如果优化器只顾着用排序索引,就可能扫描大量不必要的数据;反之,如果只顾过滤,则可能多次回表导致IO浪费。于是就出现了一个平衡点——我们可以通过调节prefer_ordering_index来决定到底优先哪一面,一言难尽。。
一句话。 哎呀, 今天要跟你聊聊这个叫prefer_ordering_index的参数,别看它名字很长,其实就是让MySQL在做排序的时候更偏爱用索引的一个小把戏。你以为这玩意儿就那么简单?不不不我可得把它拆开来好好说说。
先给你来个“开场白”
你想想看, 写个SQL: SELECT * FROM orders WHERE status='shipped' ORDER BY create_time DESC LIMIT 10; 如果没有优化器帮忙, ICU你。 MySQL可能会先把所有满足status=‘shipped’的行找出来然后再排个序。这里面就有两件事: - 扫索引 - 排序

而prefer_ordering_index这个参数, 就是告诉优化器:“嘿,优先考虑能直接按顺序读出来的索引。”如果你把它打开, 优化器就会尽量去找能支持ORDER BY字段的索引;如果你关掉,它会更关注WHERE条件的选择性,用最少扫描的数据来先过滤,再排序。
为什么这么重要?
主要原因是在实际业务里经常会遇到“高过滤性+排序”的场景。比如电商平台上要分页显示已发货订单,或者日志系统要统计最近7天每个IP登录次数。这种场景里 如果优化器只顾着用排序索引,就可能扫描大量不必要的数据;反之,如果只顾过滤,则可能多次回表导致IO浪费。于是就出现了一个平衡点——我们可以通过调节prefer_ordering_index来决定到底优先哪一面,一言难尽。。

