课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库索引是每一位软件编程开发程序员都需要熟练掌握和应用的一个编程概念,今天我们就通过案例分析来简单了解一下,数据库索引类型与优缺点分析。
聚簇索引
我们按照前面的迭代推演出了基于主键的索引结构,是一颗B+树,我们把这种索引叫做聚簇索引。
特点:
聚簇索引中的叶子节点存放了用户记录的全部数据,它就是innoDB中数据存放的格式,即数据即聚簇索引,聚簇索引即数据,这也是聚簇索引名字的由来吧,数据和索引聚集在一起。
InnoDB要求表必须有主键。如果没有显式指定,则MySQL系统会自动选择一个可以非空且标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型,这样始终就会有一个聚簇索引。
非聚簇索引
既然有了聚簇索引,那么肯定有非聚簇索引,非聚簇索引也叫二级索引或者辅助索引。
它是在什么场景出现的呢?比如我们想以别的列作为搜索条件,总不能是从头到尾沿着链表依次遍历记录一遍,肯定要慢死了。这时候就需要建立非聚簇索引,那它的索引结构和聚簇索引有什么区别呢?
索引目录的内容由3部分组成,索引列的值+主键值+页码,通过索引列的值+主键值确定新插入的列是在哪个页中,也可以确定从那个页中查询。
索引的叶子节点存放内容为索引列的值+主键值。
那可能你有疑问了,只有主键值,我要查记录的其他信息怎么办呢?
我们根据这个以c2列大小排序的B+树只能确定我们要查找记录的主键值,所以如果我们想根据c2列的值查找到完整的用户记录的话,仍然需要到聚簇索引中再查一遍,这个过程称为回表。也就是根据c2列的值查询一条完整的用户记录需要使用到2棵B+树!
回表的过程会耗时,为什么不直接存放所有的数据记录呢?
如果把完整的用户记录放到叶子结点是可以不用回表。但是太占地方了,相当于每建立一课B+树都需要把所有的用户记录再都拷贝一遍,这就有点太浪费存储空间了。
联合索引
联合索引是一种特殊的非聚簇索引,那么它的数据结构又是怎么样的呢?
比方说我们想让B+树按照c2和c3列的大小进行排序,为c2和c3建立的索引的示意图如下:
每条目录项都有c2、c3、主键、页号这4个部分组成,各条记录先按照c2列的值进行排序,如果记录的c2列相同,则按照c3列的值进行排序
B+树叶子节点处的用户记录由c2、c3和主键c1列组成。
索引优点和缺点
我们在了解了索引的数据结构以后,就更加明白索引的优缺点了。
优点
提高数据查询的效率,降低数据库的IO成本。
通过创建索引,可以保证数据库表中每一行数据的性。
在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间,降低了CPU的消耗。
缺点
创建索引和维护索引要耗费时间,并且随着数据量的增加,所耗费的时间也会增加。
索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间
降低更新表的速度。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
索引中的数据都是有序的,比如插入一条主键较小的数据,势必导致其他数据进行移动,页码发生调整,这种现象也叫做页分裂,这也是为什么推荐主键要求自增。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。