丹尼尔·维里特:使用按字节排序的索引

💡 原文英文,约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支持语言排序,但并不意味着每个文本都需要使用,考虑使用按字节排序或混合排序可能更具成本效益。
➡️

继续阅读