聚簇索引
聚簇索引是一种数据的存储方式,它的数据行只存放在索引(B+树)的叶子中,内部节点不存放数据。
聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引
非聚簇索引
非聚簇索引就是指 B+Tree 的叶子节点上的 data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的 key 一定得是唯一的。主要用在 MyISAM 存储引擎中,
InnoDB 使用的是聚簇索引,将主键组织到一棵 B+树中,而行数据就储存在叶子节点上,若使用"where id = 14" 这样的条件查找主键,则按照 B+树的检索算法即可查找到对应的叶节点,之后获得行数据。
若对 Name 列进行条件搜索,则需要两个步骤:第一步在辅助索引 B+树中检索 Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引 B+树种再执行一次 B+树检索操作,最终到达叶子节点即可获取整行数据。(重点在于通过其他键需要建立辅助索引)
非聚簇索引比聚簇索引多了一次读取数据的 IO 操作,所以查找性能上会差。
MyisAM 索引与 InnoDB 索引相比较
MyisAM支持全文索引(FULLTEXT)、压缩索引,InnoDB不支持;
InnoDB支持事务,MyisAM不支持;
MyisAM顺序储存数据,索引叶子节点保存对应数据行地址,辅助索引很主键索引相差无几;InnoDB主键节点同时保存数据行,其他辅助索引保存的是主键索引的值;
MyisAM处理字符串索引时用增量保存的方式,如第一个索引是‘preform’,第二个是‘preformence’,则第二个保存是‘7,ance’,这个明显的好处是缩短索引,但是缺陷就是不支持倒序提取索引,必须顺序遍历获取索引