sql型数据库通常使用B+树存储index(红黑树?存疑),相比B树,B+树所有数据节点都在最底层,并且每个节点都会存储下一个节点的指针,在between/>/<操作的时候可以获得很好的时间复杂度,优于B树(存疑)。
由于每次插入/删除操作都需要同时修改index,所以不合适的index反而会拖慢数据库性能。(例如插入n个数据,在没有索引时时间复杂度是O(n),有索引时时间复杂度是O(n*log(n)),耗时时间与索引数量近似成正比。)在查询操作远多于增删改操作时,index会获得较好的性能。
hash表可以丧心病狂地减少时间复杂度,当然也会丧心病狂地增加空间复杂度……文中没有详细说明hash表的使用场景,目测在表连接的时候hash表会获得较高的性能。
如
CREATE TABLE t1(a,b); CREATE TABLE t2(c,d); -- Insert many rows into both t1 and t2 SELECT * FROM t1, t2 WHERE a=c;
(from https://www.sqlite.org/optoverview.html)
对a和c使用hash表建立索引效率会提高很多(时间复杂度O(n))。然而根据sqlite官网上的介绍,这种情况下sqlite使用的是O(n*log(n))的索引,想不通。