首页 > 数据库 > SQL > 正文

SQL排序规则怎么设置_重要技巧总结提升查询效率【技巧】

冰川箭仙
发布: 2025-12-13 20:48:06
原创
830人浏览过
SQL排序由ORDER BY显式声明、索引匹配及collation协同决定;多字段按书写顺序逐级嵌套排序;需避免低区分度字段前置;ASC可省略但DESC必须显式;NULL位置须显式控制;中文排序应依赖collation或预存拼音字段;索引字段顺序须与ORDER BY完全一致才能免FileSort。

sql排序规则怎么设置_重要技巧总结提升查询效率【技巧】

SQL排序规则不是靠“设置”一次就全局生效的,而是通过 ORDER BY 子句显式声明 + 排序列索引 + 数据库级排序规则(collation)协同作用 来实现的。真正影响排序结果和性能的关键,是写法是否合理、索引是否存在、以及底层 collation 是否匹配业务需求。

多字段排序要理清优先级

数据库严格按 ORDER BY 后字段的**书写顺序**逐级排序:先比第一列,值相同时再比第二列,依此类推。这不是并行比较,而是嵌套判断。

  • 正确写法:ORDER BY status ASC, created_at DESC —— 先归类状态,同类里按时间倒序排最新在前
  • 别把低区分度字段放前面,比如 ORDER BY is_deleted, id:95%数据 is_deleted=0,几乎全表走第二级排序,索引效果大打折扣
  • 升序(ASC)可省略,降序(DESC)必须显式写出,避免歧义

NULL值处理不能靠默认

不同数据库对 NULL 的默认位置不一致:MySQL 升序时 NULL 在最前,PostgreSQL 和 Oracle 默认在最后。生产环境必须显式控制,否则分页或前端展示容易错乱。

  • 标准写法(PostgreSQL/Oracle):ORDER BY amount NULLS LAST
  • MySQL 兼容写法:ORDER BY ISNULL(amount), amount —— 把 NULL 当作 1 排最前,非 NULL 当作 0 排后面
  • 如需统一逻辑,建议在应用层补空值(如用 0 或 'N/A' 替代 NULL),比 SQL 层兜底更稳定

中文排序得靠 collation 或预计算

直接 ORDER BY name 对中文只是按 Unicode 码点排,结果是“八、匕、丁、七…”,不符合读音或笔画习惯。

拾贝
拾贝

一键同步微信读书所有笔记和划线,并在新标签页回顾

拾贝 186
查看详情 拾贝
  • 拼音排序(MySQL):ORDER BY name COLLATE utf8mb4_unicode_ci(部分版本支持)
  • 笔画排序(Oracle):ORDER BY NLSSORT(name, 'NLS_SORT=SCHINESE_STROKE_M')
  • 大数据量时,强烈建议预存拼音字段(如 pinyin_name)并建索引,避免每次查询都调用函数导致无法走索引

让排序真正快起来:索引是核心

ORDER BY 能否免排序(Index Sort),完全取决于有没有匹配的索引。没有索引的 ORDER BY,在数据量稍大时就会触发 FileSort,内存/磁盘排序开销剧增。

  • 单字段排序:给该字段建普通索引即可,如 CREATE INDEX idx_log_time ON logs(created_at)
  • 多字段排序:索引字段顺序必须和 ORDER BY 完全一致,且中间不能跳过,如 ORDER BY a, b, c DESC → 索引应为 (a, b, c);若写成 (a, c),b 就失效
  • 避免在 ORDER BY 中用函数:ORDER BY UPPER(name) 会让索引失效,改用生成列或预计算字段

基本上就这些。排序看着简单,但写错一行、少建一个索引,就可能让查询从毫秒变秒级。关键是把 ORDER BY 当作查询路径的一部分来设计,而不是最后加上的装饰。

以上就是SQL排序规则怎么设置_重要技巧总结提升查询效率【技巧】的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号