加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL索引

发布时间:2022-09-15 15:09:36 所属栏目:MySql教程 来源:
导读:  现今MySQL作为流行的关系型数据库,在各个公司中广泛应用,也是面试考察的重点。对于MySQL中索引你了解多少?带着问题一步一步来揭开它的真面目吧,应对面试官的连环拷问so easy。

  1、聚簇索引和非聚簇索
  现今MySQL作为流行的关系型数据库,在各个公司中广泛应用,也是面试考察的重点。对于MySQL中索引你了解多少?带着问题一步一步来揭开它的真面目吧,应对面试官的连环拷问so easy。
 
  1、聚簇索引和非聚簇索引是什么?
 
  简单来说,聚簇索引的索引顺序就是数据的物理存储顺序;非聚簇索引的索引顺序与数据物理排列顺序无关。具体点来说,聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。
 
  MySQL中的INNODB用就是聚簇索引,MYISAM用的是非聚簇索引。
 
  索引方式的不同是MyISAM和innoDB的主要区别,面试中经常还会被问到他们的区别是什么,这里简单列一下。
 
  附. MyISAM和innoDB的区别是什么?
 
  MyISAM
 
  innoDB
 
  索引类型
 
  非聚簇
 
  聚簇
 
  支持事务
 
  是
 
  否
 
  支持表锁
 
  是
 
  是
 
  支持行锁
 
  否
 
  是(默认)
 
  支持外键
 
  否
 
  是
 
  支持全文索引
 
  是
 
  是(5.6以后支持)
 
  适用操作类型
 
  大量select下使用
 
  大量insert、delete和update下使用
 
  innoDB作为事务型数据库的首选引擎被广为使用,下面的问题围绕INNODB引擎的聚簇索引展开。
 
  3、innoDB中一定要有主键?
 
  innoDB的索引是聚簇索引,根据聚簇索引的特性,数据记录是挂在主索引(一颗B+Tree)的叶子节点上的,所以一定要有主键,如果没有显示指定主键,innoDB会按照如下规则处理:
 
  如果一个主键被定义了,那么这个主键就是作为聚集索引如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增。4、唯一索引和主键的区别是什么?
 
  主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。唯一性索引列允许空值,而主键列不允许为空值。主键可以被其他表引用为外键,而唯一索引不能。一个表最多只能创建一个主键,但可以创建多个唯一索引。
 
  5、索引的原理(数据结构)是什么?
 
  索引数据其实是一棵带顺序索引的B+TREE
 
  6、什么是BTree、B+Tree和带顺序索引的B+TREE?
 
  BTree是平衡搜索多叉树,设树的度为2d(d>1),高度为h,那么BTree要满足以一下条件:
 
  BTree的结构如下:
 
  在BTree的结构下,就可以使用二分查找的查找方式,查找复杂度为h*log(n),一般来说树的高度是很小的,一般为3左右,因此BTree是一个非常高效的查找结构。
 
  B+Tree是BTree的一个变种,设d为树的度数,h为树的高度,B+Tree和BTree的不同主要在于:
 
  B+Tree的结构如下:
 
  B+Tree对比BTree的优点:
 
  1、磁盘读写代价更低
 
  一般来说B+Tree比BTree更适合实现外存的索引结构,因为存储引擎的设计专家巧妙的利用了外存(磁盘)的存储结构,即磁盘的最小存储单位是扇区(sector),而操作系统的块(block)通常是整数倍的sector,操作系统以页(page)为单位管理内存,一页(page)通常默认为4K,数据库的页通常设置为操作系统页的整数倍,因此索引结构的节点被设计为一个页的大小,然后利用外存的“预读取”原则,每次读取的时候,把整个节点的数据读取到内存中,然后在内存中查找,已知内存的读取速度是外存读取I/O速度的几百倍,那么提升查找速度的关键就在于尽可能少的磁盘I/O,那么可以知道,每个节点中的key个数越多,那么树的高度越小,需要I/O的次数越少,因此一般来说B+Tree比BTree更快,因为B+Tree的非叶节点中不存储data,就可以存储更多的key。
 
  2、查询速度更稳定
 
  由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的。
 
  带顺序索引的B+TREE是在叶子节点间添加了指向相邻叶节点的指针,形成了带有顺序访问指针的B+Tree,这样做是为了提高区间查找的效率,只要找到第一个值那么就可以顺序的查找后面的值。
 
  B+Tree的结构如下:
 
  7、什么是最左前缀?
 
  索引的最左前缀和和B+Tree中的“最左前缀原理”有关,举例来说就是如果设置了组合索引那么以下3中情况可以使用索引:col1,,,其它的列,比如,col2,col3等等都是不能使用索引的。
 
  根据最左前缀原则MySQL 索引,我们一般把排序分组频率最高的列放在最左边,以此类推。
 
  当然实际在写SQL时并不一定要严格按照来写,可以写成或等,这是因为数据库引擎执行优化器会自动调整where子句中的条件顺序以使用合适的索引。
 
  8、如何优化SQL?
 
  排查慢SQL,可以用explain或desc来查看SQL执行计划,它会告诉你是否用上了索引,是否全表扫描,排序策略。
 

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!