丹尼尔·维里特:使用按字节排序的索引
💡
原文英文,约1900词,阅读约需7分钟。
📝
内容提要
本文讨论了Postgres数据库中文本索引的排序方式,介绍了按字节排序的优缺点。按字节排序是指比较字符串中的字节,而不考虑字符的表示。与之相比,语言排序会考虑大小写和其他规则。文章还介绍了如何在索引中使用按字节排序。最后,文章提到了为什么大多数安装不使用按字节排序以及使用C/POSIX的弱点。文章建议在创建数据库时考虑是否需要语言排序,并介绍了C.utf8和内置的C.utf8排序的问题。文章还提到了使用'unicode'或'und-x-icu'排序来实现人类可读的排序。总之,文章认为虽然Postgres具有语言排序的好支持,但并不意味着需要在数据库中的每个文本上使用它们,因此需要考虑使用按字节排序或混合排序的成本。
🎯
关键要点
- Postgres数据库通常使用语言排序而非按字节排序,需在libc或ICU升级时重新索引。
- 按字节排序是比较字符串中的字节,不考虑字符表示,可能导致排序结果与语言排序不同。
- 语言排序在可读性、范围搜索等方面优于按字节排序,但在性能和可移植性上则相反。
- 可以通过设置COLLATE属性为C、POSIX或C.utf8来实现按字节排序。
- 大多数Postgres安装未使用按字节排序是因为默认使用操作系统的语言环境设置。
- 开发者通常不关注COLLATE设置,导致数据库和索引继承了默认的语言环境。
- C/POSIX排序在字符分类和大小写转换方面存在局限性,主要适用于US-ASCII字符集。
- C.utf8排序在处理Unicode字符时表现良好,但并非所有系统都支持,且Postgres未优化其使用。
- 未来将推出内置的C.utf8排序,以解决当前的兼容性和优化问题。
- Postgres 16引入了'unicode'排序,提供了人类可读的排序方式,简化了使用过程。
- 虽然Postgres支持语言排序,但并不意味着每个文本都需要使用,考虑使用按字节排序或混合排序可能更具成本效益。
➡️