【发布时间】:2012-08-02 14:07:25
【问题描述】:
请帮助我了解一些关于 DB 的知识。
一般情况下(=在默认配置中,没有特殊调整),考虑到行/块大小是恒定的,数据库 (=oracle/mssql) 如何存储可变长度字符串 (=VARCHAR2)?我假设他们在表行之外存储指向其他数据块的指针 - 是否正确?
此外,字符串索引是如何工作的 - B-Tree 使用字母顺序进行键比较,还是更智能的东西,如前缀树?
谢谢!
【问题讨论】:
请帮助我了解一些关于 DB 的知识。
一般情况下(=在默认配置中,没有特殊调整),考虑到行/块大小是恒定的,数据库 (=oracle/mssql) 如何存储可变长度字符串 (=VARCHAR2)?我假设他们在表行之外存储指向其他数据块的指针 - 是否正确?
此外,字符串索引是如何工作的 - B-Tree 使用字母顺序进行键比较,还是更智能的东西,如前缀树?
谢谢!
【问题讨论】:
数据库使用的索引机制完全依赖于数据库。如果您有关于数据库的具体问题,那么您应该查阅数据库的文档。我希望大多数索引都是 B 树,但这只是猜测。
关于存储可变长度字符串的问题也取决于数据库引擎。通常,这些是长度编码的,因此前两个字节具有字符串的长度,后跟字符。但是,SQL 中没有任何东西可以阻止其他机制,例如空字节编码(如在 C 中所做的那样)。可能有一些数据库以这种方式存储它们。
但是,这是一个近似值。 MSSQL 中的长字符串存储在与记录中的固定长度字段不同的数据页上。当长字符串超过页面大小时,事情就会变得复杂得多,因为字符串必须适合页面。
支持文本检索功能的数据库具有完全不同的字符串索引机制——通常是倒排索引。
如果您正在寻找解决问题的最佳方法,那么您应该在另一个问题中描述该问题。如果您正在寻找有关数据库的详细信息,那么 Google、数据库文档和 Wikipedia 是您最好的朋友。
【讨论】: