1. MVCC
- MVCC全称是多版本并发控制系统,InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的创建时间,一个保存行的过期时间(删除时间)。当然存储的并不是真实的时间而是系统版本号(system. version number)。每开始一个新的事务,系统版本号都会自动新增,事务开始时刻的系统版本号会作为事务的版本号,用来查询到每行记录的版本号进行比较
2. sql语句的执行流程
- 客户端连接数据库,验证身份
- 获取当前用户权限
- 当你查询的时候,先去缓存看,如果有返回
- 如果没有,分析器对sql做词法分析
- 优化器对sql进行“它认为比较好的优化”
- 执行器负责具体执行sql语句
- 最后把数据返回给客户端
3. 如何获取select语句的执行计划?
- explain sql
4. explain列有哪些?含义?
-
id
- SQL查询中的序列号,id数字越大越先执行,如果数字一样大,则从上往下依次执行
-
select_type
-
table
- 显示这一行的数据是关于哪张表的。不一定是实际存在的表名
-
type
- 最重要的字符之一,显示查询使用了何种类型。从最好到最差的连接类型依次为:
system、const、eq_ref、ref、fulltext、ref_or_null、index_merge、unique_subquery、 index_subquery、range、index、ALL
-
possible_keys
- 查询可能使用到的索引都会在这里列出来
-
Key
- key列显示MySQL实际使用的键(索引)
- 要想强制MySQL使用或者忽视possible_keys列中的索引,可以使用FORCE INDEX、USE INDEX或者IGNORE INDEX
- select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个
-
key_len
- 表示索引中使用的字节数
- key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。不损失精确度的情况下,长度越短越好
-
ref
- 表示上述表的连接匹配条件,即哪些列或者常量被用于查找索引列上的值
-
rows
- rows也是一个重要的字段,这是mysql估算的需要扫描的行数(不是精确值)
-
Extra
- 该列包含MySQL解决查询的详细信息,有以下几种情况:
- Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
- Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
- Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”
- Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进
- Impossible where:这个值强调了where语句会导致没有符合条件的行
- Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
- 该列包含MySQL解决查询的详细信息,有以下几种情况:
5. MySQL最多创建多少列索引?
- 16
6. 为什么最好建立一个主键?
- 主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键。设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全
7. 字段为什么要求建议为NOT NULL?
- null值会占用更多字节,且会在程序中造成很多与预期不符的情况
8. varchar(10)和int(10)代表什么含义?
- varchar的10代表了申请的空间长度,也是可以存储的数据的最大长度,而int的10只是代表了展示的长度,不足10位以0填充。也就是说,int(1)和int(10)所能存储的数字大小以及占用的空间都是相同的,只是在展示时按照长度展示
9. 视图是什么?对比普通表优势?
- 视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实际存在,行和列数据来自自定义视图的查询中使用的表,并且是在使用视图时动态生成的
- 视图相对于普通的表优势主要有:
- 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的符合条件的的结果集
- 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图可以简单实现
- 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响
10. count(*)在不同引擎的实现方式?
- MyISAM:把一个表的总行数存在了磁盘上,执行count(*)的时候会直接返回这个数,效率很高
- InnoDB:比较麻烦,它执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数
上一篇:Java面试手册V2.0+突击V3.0知识点整理(二十七) 附封面图片😍
下一篇:Java面试手册V2.0+突击V3.0知识点整理(二十九) 附封面图片😍
如果觉得封面图片还行,请顺手点个赞😍