主要是B+树索引和哈希索引
B+树索引的特点是
每个节点也就是一个页可以存储多个索引数据,这样子可以减少i/o查询的次数,也可以减少查询树的高度
叶子节点之间用指针相互连接,这样子有利于范围查询,当定位到一个字段的查询起始值和终点值的时候就可以从起始值终点值开始根据叶子节点直接遍历
所有的表数据都放在叶子节点中,这样子可以减少非叶子节点的空间占用,使每一个非叶子节点都可以尽可能多的存放索引数据,从而减少i/o的读取和查询树的高度
而这里就牵涉到了另外一个层次的概念,聚集索引和非聚集索引
聚集索引指的是数据和索引放在一起,比如B+树索引的聚集索引,就是将表的数据都放在索引树的叶子节点中
非聚集索引就是索引只存放指向对应行数据的地址, 不实际存放行数据,比如myisam的B+数索引叶子节点就只存放了对应行数据的地址
哈希索引
就是数组加链表,将索引数据调用哈希函数计算出对应的哈希值就可以找到该索引应该存放在数组的哪个下标,这里会存在哈希碰撞的情况,那么就按链表的形式顺序排放
单值查询的时候比较快,但对范围查询就无能为力了
顺带说下索引在mysql数据文件中的存放形式,
innodb存储引擎对每个表都有两个文件,一个是.frm也就是描述表结构文件,另外一个就是.ibd文件,就是索引和表数据存放的文件,表数据通过一颗B+树聚集索引 进行存放
myisam存储引擎对每个表都有三个文件,一个是.frm也一样是描述表结构的文件,一个是.myi文件,就是存放索引文件,一个是.myd文件,就是存放数据文件
还有联合索引,
就是将几个字段的数据一起放进一个索引节点.这里也是最左前缀原理的依据所在,因为索引节点会根据第一个索引字段优先排序,只有相同的情况下才是按第二个字段进行排序,依次类推,所以这就注定了根据联合索引查找必须按联合索引字段的顺序进行查询.
顺便讲一下索引设计
1.我们应该是把业务功能开发完了之后才来设计索引,因为此时我们已经有完整的sql,可以分析这些sql都分别需要用哪些字段进行查询
2.对于普遍通用的字段我们建一个联合索引把他们尽可能的覆盖到
3.对于比较独特的几个字段我们单独为他们建索引.