这些数据库索引的⾼频⾯试题,你都掌握了多少?
MySQL的索引是⾯试中的⾼频题⽬,将常见的索引⾯试题⽬总结如下,如果有帮到你可以点赞收藏呦。
什么是索引?
百度百科的解释:索引是对数据库表的⼀列或者多列的值进⾏排序⼀种结构,使⽤索引可以快速访问数据表中的特定信息。
索引的优缺点?
优点:
⼤⼤加快数据检索的速度。
将随机I/O变成顺序I/O(因为B+树的叶⼦节点是连接在⼀起的)
加速表与表之间的连接
缺点:
从空间⾓度考虑,建⽴索引需要占⽤物理空间
从时间⾓度 考虑,创建和维护索引都需要花费时间,例如对数据进⾏增删改的时候都需要维护索引。
索引的数据结构?
索引的数据结构主要有B+树和哈希表,对应的索引分别为B+树索引和哈希索引。InnoDB引擎的索引类型有B+树索引和哈希索引,默认的索引类型为B+树索引。
B+树索引 熟悉数据结构的同学都知道,B+树、平衡⼆叉树、红⿊树都是经典的数据结构。在B+树中,所有的记录节点都是按照键值⼤⼩的顺序放在叶⼦节点上,如下图。
从上图可以看出 ,因为B+树具有有序性,并且所有的数据都存放在叶⼦节点,所以查的效率⾮常⾼,并且⽀持排序和范围查。
B+树的索引⼜可以分为主索引和辅助索引。其中主索引为聚簇索引,辅助索引为⾮聚簇索引。聚簇索引是以主键作为B+ 树索引的键值所构成的B+树索引,聚簇索引的叶⼦节点存储着完整的数据记录;⾮聚簇索引是以⾮主键的列作为B+树索引的键值所构成的B+树索引,⾮聚簇索引的叶⼦节点存储着主键值。所以使⽤⾮聚簇索引进⾏查询时,会先到主键值,然后到根据聚簇索引到主键对应的数据域。上图中叶⼦节点存储的是数据记录,为聚簇索引的结构图,⾮聚簇索引的结构图如下:
volatile关键字的使用场景
上图中的字母为数据的⾮主键的列值,假设要查询该列值为B的信息,则需先到主键7,在到聚簇索引中查询主键7所对应的数据域。
哈希索引
哈希索引是基于哈希表实现的,对于每⼀⾏数据,存储引擎会对索引列通过哈希算法进⾏哈希计算得
到哈希码,并且哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向数据⾏的指针作为哈希表的value值。这样查⼀个数据的时间复杂度就是o(1),⼀般多⽤于精确查。
Hash索引和B+树的区别?
因为两者数据结构上的差异导致它们的使⽤场景也不同,哈希索引⼀般多⽤于精确的等值查,B+索引则多⽤于除了精确的等值查外的其他查。在⼤多数情况下,会选择使⽤B+树索引。
哈希索引不⽀持排序,因为哈希表是⽆序的。
哈希索引不⽀持范围查。
哈希索引不⽀持模糊查询及多列索引的最左前缀匹配。
因为哈希表中会存在哈希冲突,所以哈希索引的性能是不稳定的,⽽B+树索引的性能是相对稳定的,每次查询都是从根节点到叶⼦节点
索引的类型有哪些?
MySQL主要的索引类型主要有FULLTEXT,HASH,BTREE,RTREE。
FULLTEXT
FULLTEXT即全⽂索引,MyISAM存储引擎和InnoDB存储引擎在MySQL5.6.4以上版本⽀持全⽂索引,⼀般⽤于查⽂本中的关键字,⽽不是直接⽐较是否相等,多在CHAR,VARCHAR,TAXT等数据类型上创建全⽂索引。全⽂索引主要是⽤来解决WHERE name LIKE "%zhang%"等针对⽂本的模糊查询效率低的问题。
HASH
打开json的工具HASH即哈希索引,哈希索引多⽤于等值查询,时间复杂夫为o(1),效率⾮常⾼,但不⽀持排序、范围查询及模糊查询等。
BTREE
BTREE即B+树索引,INnoDB存储引擎默认的索引,⽀持排序、分组、范围查询、模糊查询等,并且性能稳定。
mvc在专业中是什么意思RTREE
RTREE即空间数据索引,多⽤于地理数据的存储,相⽐于其他索引,空间数据索引的优势在于范围查
索引的种类有哪些?
主键索引:数据列不允许重复,不能为NULL,⼀个表只能有⼀个主键索引
组合索引:由多个列值组成的索引。
唯⼀索引:数据列不允许重复,可以为NULL,索引列的值必须唯⼀的,如果是组合索引,则列值的组合必须唯⼀。
全⽂索引:对⽂本的内容进⾏搜索。
普通索引:基本的索引类型,可以为NULL
B树和B+树的区别?
B树和B+树最主要的区别主要有两点:
B树中的内部节点和叶⼦节点均存放键和值,⽽B+树的内部节点只有键没有值,叶⼦节点存放所有的键和值。mysql面试题sql
B+树的叶⼦节点是通过相连在⼀起的,⽅便顺序检索。
两者的结构图如下。
数据库为什么使⽤B+树⽽不是B树?
B树适⽤于随机检索,⽽B+树适⽤于随机检索和顺序检索
B+树的空间利⽤率更⾼,因为B树每个节点要存储键和值,⽽B+树的内部节点只存储键,这样B+树的⼀个节点就可以存储更多的索引,从⽽使树的⾼度变低,减少了I/O次数,使得数据检索速度更快。resource资源
B+树的叶⼦节点都是连接在⼀起的,所以范围查,顺序查更加⽅便
B+树的性能更加稳定,因为在B+树中,每次查询都是从根节点到叶⼦节点,⽽在B树中,要查询的值可能不在叶⼦节点,在内部节点就已经到。
那在什么情况适合使⽤B树呢,因为B树的内部节点也可以存储值,所以可以把⼀些频繁访问的值放在距离根节点⽐较近的地⽅,这样就可以提⾼查询效率。综上所述,B+树的性能更加适合作为数据库的索引。
什么是聚簇索引,什么是⾮聚簇索引?
聚簇索引和⾮聚簇索引最主要的区别是数据和索引是否分开存储。
聚簇索引:将数据和索引放到⼀起存储,索引结构的叶⼦节点保留了数据⾏。
⾮聚簇索引:将数据进和索引分开存储,索引叶⼦节点存储的是指向数据⾏的地址。
在InnoDB存储引擎中,默认的索引为B+树索引,利⽤主键创建的索引为主索引,也是聚簇索引,在主索引之上创建的索引为辅助索引,也是⾮聚簇索引。为什么说辅助索引是在主索引之上创建的呢,因为辅助索引中的叶⼦节点存储的是主键。
在MyISAM存储引擎中,默认的索引也是B+树索引,但主索引和辅助索引都是⾮聚簇索引,也就是说索引结构的叶⼦节点存储的都是⼀个指向数据⾏的地址。并且使⽤辅助索引检索⽆需访问主键的索引。
可以从⾮常经典的两张图看看它们的区别(图⽚来源于⽹络):
delphi 论坛⾮聚簇索引⼀定会进⾏回表查询吗?
上⾯是说了⾮聚簇索引的叶⼦节点存储的是主键,也就是说要先通过⾮聚簇索引到主键,再通过聚簇索引到主键所对应的数据,后⾯这个再通过聚簇索引到主键对应的数据的过程就是回表查询,那么⾮聚簇索引就⼀定会进⾏回表查询吗?
答案是不⼀定的,这⾥涉及到⼀个索引覆盖的问题,如果查询的数据再辅助索引上完全能获取到便不需要回表查询。例如有⼀张表存储着个⼈信息包括id、name、age等字段。假设聚簇索引是以ID为键值构建的索引,⾮聚簇索引是以name为键值构建的索引,select id,name from user where name = 'zhangsan';这个查询便不需要进⾏回表查询因为,通过⾮聚簇索引已经能全部检索出数据,这就是索引覆盖的情况。如果查询语句是这样,select id,name,age from user where name = 'zhangsan';则需要进⾏回表查询,因为通过⾮聚簇索引不能检索出age的值。那应该如何解决那呢?只需要将索引覆盖即可,建⽴age和name的联合索引再使⽤select id,name,age from user where name = 'zhangsan';进⾏查询即可。
所以通过索引覆盖能解决⾮聚簇索引回表查询的问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论