mysql

聚簇索引

2019-02-14  本文已影响0人  阿长_一个程序员

聚簇索引是一种数据的存储方式,它的数据行只存放在索引(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’,这个明显的好处是缩短索引,但是缺陷就是不支持倒序提取索引,必须顺序遍历获取索引

聚簇索引的优势

聚簇索引的劣势

  1. 如果使用UUId(随机ID)作为主键,使数据存储稀疏,这就会出现聚簇索引有可能有比全表扫面更慢,

所以建议使用int的auto_increment作为主键

如果主键比较大的话,那辅助索引将会变的更大,因为辅助索引的叶子存储的是主键值;过长的主键值,会导致非叶子节点占用占用更多的物理空间

为什么主键通常建议使用自增id

上一篇 下一篇

猜你喜欢

热点阅读