引言 |
聚簇索引并不是一种索引类型,只是一种存储方式。当表有了聚簇索引的时候,表的数据行都存放在索引树的叶子页中。无法把数据行放到两个不同的地方,所以一张表只允许有一个聚簇索引。
索引使得大多数时候我们避免全表扫描,使数据的性能有一定的提高。而聚簇索引的影响力也是很大的。我们熟悉的Myisam和innodb两大引擎,innodb的默认数据结构是聚簇索引,而Myisam是非聚簇索引。
Innodb是通过主键来聚集数据的,就是“被索引的列就是主键”。如果一张表没有主键,那就会通过某一唯一列来聚集数据,没有唯一列的时候,就会隐式的生成一个id,通过这个id来聚集数据。
区别 |
1. 在mysql安装目录上,我们也可以明显的看出两者的区别:
我们可在安装目录下查到这两个目录。这两个目录的My指的是Myisam引擎,D是data,i是index。
但是我们确找不到ini和ind之类的文件,只能查到一些idb文件。这也就是提现出聚簇索引和非聚簇索引的一点区别了:
a):在Myisam引擎索引和数据是分开存储的,而Innodb是索引和数据是一起以idb文件的形式进行存储的。
b):在访问速度上,聚簇索引比非聚簇索引快。非聚簇索引需要先查询一遍索引文件,得到索引,跟据索引获取数据。而聚簇索引的索引树的叶子节点的直接指向要查找的数据行。
2. :从二级索引查询看
对于采用聚簇索引的innodb引擎的主键索引B+Tree和Myisam的主键索引树还有Myisam的二级索引B+Tree都是采用这样的结构。但是Innodb的二级索引B+Tree却是这样的:
所以可以得出:
在使用二级索引进行查询的时候,Innodb首先通过二级索引B+Tree得到数据行的主键索引,然后再通过主键索引树查询数据。所以在二级索引,Innodb的性能消耗比较大。
但是,这种情况在innodb中有一定的优化,不是认为控制的,而是引擎实现的,通过二级索引查询多了,innodb会生成自适应的哈希索引。
扩展问题 |
根据B+Tree的插入过程,取什么样的主键会带来什么问题?
使用自增主键比其它主键好,因为根据B+Tree的插入,主键采用自增主键会保证每次都在最后面增加叶子节点。不会带来新数据的插入,导致前面的数据变动,而产生页分裂,随之带来空间碎片和时间的消耗。
但是使用自增主键,这样的主键有上界啊,而且在并发的情况下怎么保证获取到的主键是正确的?怎么解决上界问题?
对于并发怎么保证获取的主键是正确的,可以看innodb的Auto_increment锁机制。遇到这种问题则可能要考虑重新设计表,或者更改innodb_auotinc_lock_mode参数。
对于上界问题,自己还没有更好的认识,有遇到过的朋友可以告诉一下解决方案。
还有很多问题需要理解,则还需要继续学。