原帖;http://www.newsmth.net/nForum/#!article/Algorithm/37574?p=1
关系型数据库的索引大多采用B/B+树来作为存储结构,而全文检索的搜索引擎则主要采用Hash来作为索引的存储结构,这两类系统的算法都比较成熟了,为什么它们要在各自的应用环境下采用这两种数据结构来存储索引。
我个人的理解是:
数据库系统库表比较多,讲究的是灵活,尤其是在空间上的flexible很重要,而B/B+树在扩展上具有较好的空间优势(当表中数据行比较少的时候,其索引也比较小,比较灵活且节省空间),当然其查询速度在在O(logN)级别上也算是比较高了。
而搜索引擎对查询速度要求很高,所以Hash是查询速度最快的一种索引数据结构,但是它是牺牲了空间的代价,因为动态Hash一直是一个比较难的问题,所以开始为了保证较合适的填充因子,所以不得不开一个比较大的空间来存储索引,此时数据内容的条数可能并不是很多。
Hash应该也可以动态插入删除吧,只是当比较饱和的时候,需要重新开辟空间进行动态hash增容。
大规模数据库上考虑的是磁盘和内存之间的I/O代价
而不是一般算法里考虑的计算代价
一个又肥又矮的树,
利于I/O
树的平衡维持和空间利用率都不错,
hash会导致磁盘上的random access,所以一定会很低效
如果是B+树的话,range query(区域查询)更好。
另外,磁盘上的spatial locality对IO的影响也很大。
hash?
只是一个期望值为O(1)的方法,实现起来,规模上来的时候不那么好使。