索引是index_field(s) + pointer,提高查询效率,缺点是维护索引有额外开销,需要建立合适的索引。
总体上可以分为顺序索引、散列索引和位图索引。
1、顺序索引,常用B+树实现
(1)聚集索引和非聚集索引:聚集索引(主索引)只有一个,主文件按某个搜索码排序,该搜索码对应的索引是聚集索引,搜索码不一定是主键(即聚集索引的物理顺序与索引顺序相同)。
建表时的主键必须是索引,默认是聚集索引,根据聚集索引插入数据。
非聚集索引(辅助索引)的物理顺序与索引顺序不同。
(2)稠密索引和稀疏索引:稠密索引是文件中的每个搜索码值都有一个索引项;稀疏索引是只为某些搜索码值建立索引项。
只有文件是聚集索引(排好序)时才能使用稀疏索引。
聚集索引可以是稀疏索引;非聚集索引一定是稠密索引。
(3)多级索引:如B+树索引
(4)倒排索引:便于查找一个关键字出现在了哪些文件中。word w : {#doc1, #doc2}
2、散列索引,不能进行范围查找
(1)静态散列索引:就是一张散列表,每个entry包含索引项+指针,用链表等方法解决冲突。缺点是数据变多后需要rehash
(2)动态散列索引:取散列值的前i位做索引,有指向对应桶的指针,桶有多个指向文件的指针
3、位图索引
可以用位运算实现高效查询。例如gender的位图m=10010,f=01101表示0,3记录为男性,1,2,4为女性