mysql建⽴聚簇索引_MySQL索引(聚簇索引和⾮聚簇索引)1、前提2、定义概念3、索引类型4、聚集索引和⾮聚集索引5、索引的优缺点1、前提
MySQL索引⼀直是⾯试中的常客,⼀提起索引,很多⼈都能答出来我知道Hash索引和B+树索引,Hash是⽐较简单的,那么B+树索引就有点复杂了。tent
在创建表的时候,我们可以看到引擎有MyISAM , InnoDB等等,这两种是我们经常说到的,从5.5版本及以后引擎就默认为InnoDB了,也说的是从5.1版本之后就默认是InnoDB了,不过这个不⽤纠结,反正现在使⽤的mysql基本都默认引擎为InnoDB,我们这篇⽂章都是基于InnoDB来说的。
2、定义概念
在关系数据库中,索引是⼀种单独的、物理的对数据库表中⼀列或多列的值进⾏排序的⼀种存储结构,它是某个表中⼀列或若⼲列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作⽤相当于图书的⽬录,可以根据⽬录中的页码快速到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使⽤索引以到特定值,然后顺指针到包含该值的⾏。这样可以使对应于表的SQL语句执⾏得更快,可快速访问数据库表中的特定信息。
当表中有⼤量记录时,若要对表进⾏查询,第⼀种搜索信息⽅式是全表搜索,是将所有记录⼀⼀取出,和查询条件进⾏⼀⼀对⽐,然后返回满⾜条件的记录,这样做会消耗⼤量数据库系统时间,并造成⼤量磁盘I/O操作;第⼆种就是在表中建⽴索引,然后在索引中到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速到表中对应的记录。
3、索引类型
根据数据库的功能,可以在数据库设计器中创建四种索引:单列索引、唯⼀索引、主键索引和聚集索引。
主键索引,唯⼀索引什么的,都⽐较简单,这⾥就不展开介绍了。主要介绍⼀下聚集索引。
4、聚集索引和⾮聚集索引
定义概念
聚集索引也称为聚簇索引(Clustered Index),聚类索引,簇集索引 。同样,⾮聚集索引也称为⾮聚簇索引,⾮聚类索引,⾮簇集索引。c语言在线编程oj答案>vlookup函数两张表匹配不同数据
聚集索引是指数据库表⾏中数据的物理顺序与键值的逻辑(索引)顺序相同。⼀个表只能有⼀个聚集索引,因为⼀个表的物理顺序只有⼀种情况,所以,对应的聚集索引只能有⼀个。如果某索引不是聚集索引,则表中的⾏物理顺序与索引顺序不匹配,与⾮聚集索引相⽐,聚集索引有着更快的检索速度。
在InnoDB中,MySQL中的数据是按照主键的顺序来存放的。那么聚簇索引就是按照每张表的主键来构造⼀颗B+树,B+树是在B树的基础上改进的,不会的可以看⼀下之前的⽂章。叶⼦节点存放的就是整张表的⾏数据。由于表⾥的数据只能按照⼀颗B+树排序,因此⼀张表只能有⼀个聚簇索引。
引⼊⼀个问题:如果表没有主键怎么办?(⼀般都会建主键的)
回答是,如果没有主键,则按照下列规则来建聚簇索引
excel在线教学没有主键时,会⽤⼀个唯⼀且不为空的索引列作为主键,成为此表的聚簇索引。
如果没有这样的索引,InnoDB会隐式定义⼀个主键来作为聚簇索引。
ps:⾃增主键和uuid作为主键的区别是什么呢?由于主键使⽤了聚簇索引,如果主键是⾃增id,那么
mysql语句的执行顺序
对应的数据⼀定也是相邻地存放在磁盘上的,写⼊性能⽐较⾼。如果是uuid的形式,频繁的插⼊会使innodb频繁地移动磁盘块,写⼊性能就⽐较低了。
实例讲解聚集索引
先来创建⼀个表user如下:pId是主键,有字段name和birthday。
这⾥我们说的是InnoDB引擎,那主键索引也是⼀个聚集索引,底层结构是B+树。
下⾯⼀张图是简略的图,如果你清楚了B+树的结构,那理解起来这个就很轻松了。
图⽰很清楚,上半部分是主键形成的B+树,下半部分是磁盘上存储的真实数据。
当我们执⾏以下语句:
select * from user where pId = 11
anidiotabroad那么执⾏流程如下:
如上图所⽰,从根开始,经过3次查,就可以到真实数据。如果不使⽤索引,那就要在磁盘上,逐⾏扫描,直到到数据位置。显然,使⽤索引速度会很快。但是,在写⼊数据的时候,需要维护这颗B+树的结构,因此写⼊性能会下降!
接下来咱们再理解⼀下⾮聚集索引,给name字段加⾮聚集索引。通过执⾏下⾯命令来添加索引,你也可以使⽤可视化⼯具来添加索引。 CREATE INDEX NAME ON test(NAME);
咱们再来看看给name添加索引之后,结构图是什么样⼦的?
从上⾯图中,我们可以看到根据索引name新⽣成了⼀棵B+树。我们每加⼀个索引,就会增加表的体积, 占⽤磁盘存储空间。并且这⾥还有⼀点变化,叶⼦节点,⾮聚簇索引的叶⼦节点并不是真实数据,它的叶⼦节点依然是索引节点,存放的是该索引字段的值以及对应的主键索引(聚簇索引)。
如果我们执⾏下列语句
select * from user where name = 'lisi'
我们现在加了⾮聚集索引之后,这条sql语句怎么去查询呢?
再来⼀张图:
通过上图我们看到,先从⾮聚簇索引树开始查,到name为lisi的叶⼦节点,根据lisi的主键pId,再去聚簇索引B+树中去,就能拿到pId对应的⾏数据。
再看下⾯的这⼀条语句,在查询的时候在⾮聚簇索引上就到了要的name值,那么就不会再去聚簇索引上查了。效率更⾼。
select name from user where name = 'lisi'
总结
通过上⾯的例⼦,我们看到多加⼀个索引,就会多⽣成⼀颗⾮聚簇索引树。所以说,索引不能乱加。在做插⼊操作的时候,需要同时维护这⼏颗树的变化!如果索引太多,插⼊性能就会下降!
5、索引的优缺点
优点:
1.⼤⼤加快数据的检索速度;
2.创建唯⼀性索引,保证数据库表中每⼀⾏数据的唯⼀性;
3.加速表和表之间的连接;
4.在使⽤分组和排序⼦句进⾏数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占物理空间。
2.当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。