SQL中主键,聚集索引,非聚集索引的区别

主键:

主键是表中通常有唯一标志着表中的每一行的值的一列或者多列,它的值用于唯一地标识表中的某一条记录,用于强制表的实体完整性。主键用来一个表引用来自其他表的特定记录,主键是一种唯一关键字,表定义的一部分。可以理解为一个记录行的标识。我们通过这个标识,就能精确把这行记录找出来,它在表中是唯一的

 

聚集索引:
前提是上面,如果我们定义了主键,那么innodb会选择主键作为聚集索引,如果没有显示定义的主键,那么就会选择不包含NULL值的唯一索引作为聚集索引,如果也没有这样的唯一索引列,那么INNODB就选着内置6字节长的rowID作为隐含的聚集索引,这里的RowId会随着记录的写入而主键自增,但是它是不可引用和查看的,是数据库引擎内部的使用。

如果我们使用自增主键,那么每次插入的新纪录都在原先记录的尾部按照顺讯的添加到当前节点的索引后面,当一页快写满的时候,就会开辟一个新的页。

数据记录本身就存与主索引的叶子节点上,B+tree的树。这就要求每一个叶子节点内的各条数据记录按主键顺序存放,因此每当有有一条新的记录插入的时候,MYSQL会根据其主键将其插入到合适的节点和位置上,如果页面达到装载因子(INNODB默认为15/16),则开辟新的页面(节点)

 

非聚集索引:

如果我们使用非聚集索引,例如我们平时所说的身份证号,学号等,因为每个人的身份证号,学号都不一样,所以我们每次插入的值等同随机插入,当插入一个新的数据的时候,MYSQL不得不给数据找一个合适的位置插入,并且可能会移动其他的数据记录位置,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉了,此时又要从磁盘中读回来,这就增加了很多的开销,同时频繁的移动数据,分页操作造成数据的大量碎片。索引结构就不够紧凑,后续可能不得不Optimize table来重新构建表,进行优化。

总结:在效率方面最好使用聚集索引,并给表设定唯一主键。在数据索引的存储有序的情况下,可以大大提高效率。在有序的情况下,通过索引查询数据就无需遍历索引记录。就算在极端的情况下,数据查询的效率是二分法查询。将近是Log(N)

你可能感兴趣的:(学习,面试,JAVA)