MySQL 8中含DISTINCT+BINARY的慢查询是否被弃用?为何缓慢及优化?
问题解答
1. 该查询在MySQL 8中是否被弃用?
没有被弃用。DISTINCT结合BINARY的写法在MySQL 8中属于合法语法,并未被官方标记为弃用或移除。
2. 适配MySQL 8的修改建议
原写法本身可正常运行,但可以优化写法更规范:
SELECT DISTINCT BINARY `meta_key` AS meta_key_binary, `meta_key` FROM wp_postmeta ORDER BY `meta_key` ASC;
另外,也可以用GROUP BY替代DISTINCT,二者逻辑等价,部分场景下执行计划更高效:
SELECT BINARY `meta_key` AS meta_key_binary, `meta_key` FROM wp_postmeta GROUP BY `meta_key` ORDER BY `meta_key` ASC;
3. 查询运行缓慢的原因分析
- 缺少对应索引:如果
wp_postmeta表没有为meta_key字段创建索引,MySQL需要执行全表扫描来处理去重和排序,哪怕数据量不大,全表扫描的开销也会拖慢查询。 BINARY转换阻断索引使用:对meta_key做BINARY转换后,MySQL无法直接利用meta_key上的普通索引(索引存储的是字符串原值,而非二进制转换后的值),只能逐行转换后再去重,额外增加了计算开销。- 排序的磁盘IO开销:
ORDER BY meta_key需要对去重后的结果集排序,如果结果集超出MySQL内存排序的阈值,会触发磁盘临时表排序,耗时会显著上升。 - 表统计信息过时:如果MySQL对
wp_postmeta表的统计信息不准确,优化器可能误判数据分布,选择了低效的执行计划,导致查询变慢。
内容的提问来源于stack exchange,提问作者jelkaa
相关产品推荐
相关产品推荐

