强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现。
索引:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。其表达的是存储引擎的范畴,也就是说只有在存储引擎级别谈索引才有意义。MyISAM、InnoDB、Memory等。此处单纯就InnoDB存储引擎讨论。
B-TREE、B+TREE数据结构。
在数据之外,数据库系统还维护着满足特定查找算
法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引
1、主码索引:就是在主码基础上建立的索引。primary key。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。又称主码索引,聚集主码。
此处的主索引又分为有序主码索引(例如id自增),和不按序排列的索引(例如name-varchar类型),此时对填充因子影响特别大。
2、聚集主码。为什么主码索引(主索引)又称为聚集主码。此处的聚集其实是指数据文件与索引聚集在叶子节点,而不是像MyISAM中叶子节点存储的是数据文件的地址。可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键 (MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为 InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
3、辅助索引。辅助索引是相对于主码索引而言的。在MyISAM中,辅助索引的结构和主码索引的结构是一样的,都是采用的是B+树结构,且叶子节点存储的都是数据记录的地址。而InnoDB中虽然也采用的是B+树存储,但是辅助索引的叶子节点存储的是对应于主码索引的主键。也就是说如果你通过辅助索引查找数据,要先在B+树中查找到主键,然后根据主索引查找到对应的记录,查找两次。
4、非主码索引。又称非主索引和辅助索引,同上面辅助索引。
注:要求主码列数据长度不能太长,因为辅助索引中叶子节点存储主键值,太长会导致辅助索引的额外存储空间太大。
5、唯一索引。唯一索引就是指列的值唯一,建立起来的索引,数据完整性检查。主索引肯定是唯一索引。一张表中可以有多个唯一索引,并且可以为NULL的列也可以建立唯一索引(NULL!=NULL),但是一张表中只能有一个主索引(主键唯一),并且该列不能为NULL,如果定义了AUTO INCREMENT列,该列必须是主索引的一部分。
普通索引、唯一索引、主索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引
6、外键索引。外键索引其实就是主索引或者辅助索引,主要用于表之间的连接操作等与外键有关的操作。如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。目前MySQL默认的存储引擎中,只有InnoDB支持外键约束且不要求存在对应列的索引,但是通常考虑效率都应加上。
7、
参考文献:
3、
普通索引、唯一索引、主索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引
原文:http://www.cnblogs.com/xiangyangzhu/p/5400389.html