mysql的数据结构面试题


[怄火] B树和B+树的区别,mysql为什么选择B+树?


(1)区别
B树的特点:
1.一个节点可以包含多个索引元素
2.叶子节点的数据索引是从左到右递增排序,是排好序的
3.每个节点都带有data。

B+树的特点:
1.一个节点可以包含多个索引元素
2.只有叶子节点才带有data,非叶子节点只有索引,并且是冗余的。{为什么要用冗余的非叶子节点?答:使用2分查找更便捷}
3.叶子节点与叶子节点之间有指针。{这个指针有什么作用?答:加速范围查询和顺序访问}
(2)mysql为什么选择B+树
因为对于关系型数据库,树的高度决定了查询的性能,B+树比B树的优势在于,一页节点内能容纳的索引元素比B树多。相同的数据量,B+树的树高比B树低,能更快的找到目标索引,减少磁盘io次数。


[怄火]mysql的索引结构是怎样的,聚簇索引和非聚簇索引分别是什么?


索引结构采用B+树的结构。
B+树的特点是
1.一个节点包含多个索引元素
2.非叶子节点是冗余索引,没有data
3.叶子节点带有data,叶子节点与叶子节点之间有从左指向右的指针。并且是按照从左到右递增排序。在mysql中叶子节点与叶子节点之间的指针变成双向,方便范围查询和全表扫描。

在mysql中,聚簇索引和非聚簇索引都是B+树的数据结构。
聚簇索引是指叶子节点上的data就是数据本身,
innodb就是使用了聚簇索引,一个表内只能有一个聚簇索引,如果表定义了主键(PK),那PK就是聚簇索引。如果没有PK,就会找第一个非空的unique列作为聚簇索引。否则,innodb会创建一个隐藏的row_id作为聚簇索引。
非聚簇索引是指叶子节点上的data并非数据本身,而是数据存放的地址(.MYD)。
MyISAM使用的就是非聚簇索引,一个表内可以有多个非聚簇索引。


[怄火]为什么mysql的主键推荐使用自增的正数?


首先mysql的索引结构是B+树。B+树的特性是叶子节点是从左到右递增排序的,如果插入的时候不是递增的数字,那么可能会造成节点拆分,重新达成平衡【影响性能】。而使用自增的数字,则不会出现这种情况。


[怄火]为什么非聚簇索引的data不跟聚簇索引一样,存储数据本身呢?


最大原因是为了减少存储空间,其次是简化复杂度,如果每个非聚簇索引都保存一遍数据,那么保持数据一致性也是一种大工程,还减低了性能。


[怄火]为什么mysql推荐我们innodb要创建主键?


如果我们不主动创建主键索引,mysql会自动帮我们创建主键索引。当表内没有主键(PK),就会找第一个非空的唯一(unique)列作为聚簇索引,否则,innodb会创建一个隐藏的row_id作为聚簇索引。


[怄火]为什么mysql不用hash索引?


hash索引虽然有可能只需要一次就能找到数据,但是存在1. hash冲突 2.仅支持“=”、“in”,不支持范围查询


[怄火]为什么最左前缀原则会匹配索引?


因为索引是排好序的数据结构,假定一个索引有三个字段组成,它会先比较字段1,再比较字段2,最后比较字段3.所以最左前缀满足索引的数据结构,所以才会匹配。


[怄火] explain语句结果中各个字段分别表示什么


id: 正整数,数字越大,优先级越高,当有多个相同数字时,排上面的先执行。
select_type: 表示查询语句的类型,有simple、primary、derived(衍生)、subquery
table:表示每行记录查询哪张表
partitions:分区
type:表示关联类型或访问类型。效率逐步递减:system>const>eq_ref>ref>range>index>all
possible_keys:可能用到的索引,会有多条
key:实际上使用的索引
key_len:实际使用到的索引长度
ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows:预估的需要读取的记录条数
filtered:某个表经过搜索条件过滤后剩余记录条数的百分比
Extra:一些额外的信息,比如排序:filesort等。


[怄火] 大致统计表的数据,除了用count还能用什么?


show table status like ‘table表’;
在row字段下会展示一个大概值。适用于数据量很大,对分页不是特别精准的情况。缺点:不适合用于有条件的统计。针对条件查询,需要借助于搜索引擎比如es,比如大数据引擎flink。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值