MySQL面试整理
Posted Mr. Dreamer Z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL面试整理相关的知识,希望对你有一定的参考价值。
mysql面试整理
- 1.B树和B+树的区别?
- 2.预读和局部性原理?
- 3.聚簇索引/聚集索引
- 4.非聚簇索引
- 4.1 辅助索引/二级索引
- 4.2 联合索引/复合索引
- 5. UNION ALL和UNION
- 6. Mysql中innodb支持的四种事务隔离级别
- 7.[select *]和[select 全部字段]的区别
- 8.扩展
1.B树和B+树的区别?
由图可知,
B树的所有节点上都有key和data,而B+树只有叶子节点上有data,而且叶子结点包含了这棵树所有的键值,而且叶子结点会组成一个单链表。
而且由于一棵树16K,所以B+树保留键的能力大大提高。而且B+树的数据都需要在叶子结点上,所以查询的次数也都一样,查询次数更稳定。而且形成了单链表,所以范围查询更方便。
2.预读和局部性原理?
当一个数据被用到时,其他附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。
3.聚簇索引/聚集索引
聚簇索引其实就是将表的主键用来构造一颗B+树,然后将整张表的行记录存放在叶子节点上。如上图。
由主键列和其他列(表的数据)组成。
注意:如果没有定义主键,mysql会创建一个隐含主键rowId,用它来创建聚簇索引。
4.非聚簇索引
4.1 辅助索引/二级索引
B+树在索引列上是排好序的。
注意:排序规则只能有一个。索引列排好序之后,主键列就无法排序了。
Select * 会回表,先通过辅助索引,查找聚簇索引。(需要用到两颗B+树)
辅助索引就是非主键索引且非复核索引。它由索引列和主键列组成
4.2 联合索引/复合索引
由对应的索引列和主键列组成,比如:insert_time,order_status,expire_time。索引列就有:insert_time,order_status,expire_time三个+主键列。会根据索引的顺序进行排序,如上图。
5. UNION ALL和UNION
union all要比union快的多。因为union需要去重
6. Mysql中innodb支持的四种事务隔离级别
mysql中对应的事务特性:ACID
原子性(atomicity):一个事务要么全部提交成功,要么失败回滚。
一致性(consistency):事务不能破坏数据库的一致性,一个事务在执行前后,数据库都必须要保证一致性。如:A账号+100,B账户-100.
持久性(durability):一旦提交,永久保存。
隔离性(isolation):各个事务之间的操作互不影响。
四个隔离级别:
读未提交:
读未提交表明读取了别人修改未提交的数据。被称为脏读
读已提交:
这是大多数数据库系统的默认隔离级别(但不是mysql默认的)。一个事务只能看到已经提交的事务所做出的改变。会出现不可重复读,可能两次select返回不同的结果。
可重复读:
这是mysql默认的事务隔离级别,它能够避免不可重复读。但是会有另外一个问题——幻读。简单来说,就是当用户读取某一范围数据行时,另一个事务又在该范围内插入了新行。所以导致两次读出来的数据行不一致,觉得自己产生了“幻觉”.
不可重复和幻读的区别:不可重复读存在于修改操作中,幻读对于新增或者删除操作。
可串行化:
这是最高级别的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读的问题。简而言之它是在每个读的数据行上加入共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
7.[select *]和[select 全部字段]的区别
1.前者要解析数据字典,后者不需要
2.后者可以建立索引进行优化,前者不行
3.后者可读性要比前者强
8.扩展
非主键索引的就是二级索引
in中的数据,每一个代表一个单点扫描区间。
重点:由于mysql中select只能有一个二级索引,所以无论优先执行哪一个,其余两个只能在第一次检索后作过滤条件
这就是为什么 % 在前,无法使用索引。无法进行对应的扫描,因为索引列会进行排序,但是如果是百分号开头,那么会进行全文扫描,再进行操作。
以上是关于MySQL面试整理的主要内容,如果未能解决你的问题,请参考以下文章