MySQL索引中可以分为聚集索引与非聚集索引两类,在网络上也见过聚簇的说法,这里先简单介绍两种索引的含义与适用场景。懒得画图,全是字。
索引的键值逻辑顺序决定了表数据行的物理存储顺序,也就是在数据库上连接的记录在磁盘上的物理存储地址也是相邻的,注意这一点特性,我们可以分析出它的适用情况。由于聚集索引规定了数据项,也可以说是记录在表中的物理存储顺序,物理顺序唯一,自然每张表中的聚集索引也是唯一的,但是它可以包含多个列,多个字段。
聚集索引类似于新华字典中用拼音去查找汉字,拼音检索表于书记顺序都是按照a~z排列的,就像相同的逻辑顺序于物理顺序一样,当你需要查找a,ai两个读音的字,或是想一次寻找多个傻(sha)的同音字时,也许向后翻几页,或紧接着下一行就得到结果了。
进一步来说,当你需要查询的数据经常被分组看待(分类),或是经常查询范围性的数据(本月,本周总结),不同值的小数目等情况时,可以使用聚集索引。
自然,非聚集索引也就是存储的键值逻辑连续,但是在表数据行物理存储顺序上不一定连续的索引,也就是索引的逻辑顺序与磁盘上的物理存储顺序不同。
非聚集索引类似在新华字典上通过偏旁部首来查询汉字,检索表也许是按照横、竖、撇来排列的,但是由于正文中是a~z的拼音顺序,所以就类似于逻辑地址于物理地址的不对应。同时适用的情况就在于分组,大数目的不同值,频繁更新的列中,这些情况即不适合聚集索引。
某些情况下索引与物理存储逻辑有关:
其中存在一种情况,MySQL的MyISAM引擎B+树式的存储结构,把叶子结点上存放的并不是数据本身,而是存放数据的地址,所以在使用索引时,例如主索引、辅助索引有时达不到想要的效果,雅思机经是什么而且都是非聚集索引。
主键不一定适合加上聚集索引,有时甚至是一种对这个唯一的聚集索引的浪费(虽然在SQLServer中主键默认为聚集索引),并非在任何字段上加上聚集/非聚集索引都能提高查询效率。下面我们结合实际情况分析。
优势:
- 能够保证数据每一行的唯一性
- 合理运用时加快数据的查询速度
- 增强表与表之间的链接,参考完整性
- 减少分组、排序等操作的查询时间
- 优化查询过程,提高系统性能
弊端:
- 创建、维护索引的时间会随着数据量的增加而增加
- 自然,索引也是需要占据物理空间的
- 增删改查数据的时候,也会由于索引的存在而增加时间,类似于多了一个属性,也会降低表更新的速度
总而言之,这只是MySQL查询时优化速度等方面的冰山一角,还是需要多分析,多考虑,根据实际情况去选择各种辅助功能的使用,才能得到相对最高的效率。