2019最新21个MySQL高频面试题介绍(2)

可移植性、备份及恢复,MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进 行操作。InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了。

存储结构,MyISAM:每个 MyISAM 在磁盘上存储成三个文件。第一 个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表 定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名 是.MYI (MYIndex)。InnoDB:所有的表都保存在同一个数据文件 中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大 小只受限于操作系统文件的大小,一般为 2GB。

9、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

Read Uncommitted(读取未提交内容) >> 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(读取提交内容) >> 这是大多数数据库系统的默认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结果。

Repeatable Read(可重读) >> 这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。

Serializable(可串行化) >> 这是最高的隔离级别,它通过强制事务 排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个 读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁 竞争。

10、[SELECT *] 和[SELECT 全部字段]的 2 种写法有何优缺点?

前者要解析数据字典,后者不需要

结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。

表字段改名,前者不需要修改,后者需要改

后者可以建立索引进行优化,前者无法优化

后者的可读性比前者要高

11、简述 Mybatis 的插件运行原理,以及如何编写一个插件?

Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、 Executor 这 4 种接口的插件,Mybatis 通过动态代理,为需要拦截的接口生成代理对象以实 现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler 的 invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

实现 Mybatis 的 Interceptor 接口并复写 intercept()方法,然后在给插件编写注解,指定 要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

12、#{}和${}的区别是什么?

{}是预编译处理,${}是字符串替换。

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法 来赋值。

Mybatis 在处理${}时,就是把${}替换成变量的值。

使用#{}可以有效的防止 SQL 注入,提高系统安全性。

13、什么是索引?请简述常用的索引有哪些种类?

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则在表中搜索所有的行相比,索引有助于更快地获取信息

通俗的讲,索引就是数据的目录,就像看书一样,假如我想看第三章第四节的内容,如果有目录,我直接翻目录,找到第三章第四节的页码即可。如果没有目录,我就需要将从书的开头开始,一页一页翻,直到翻到第三章第四节的内容。

MySQL索引的分类

我们根据对以列属性生成的索引大致分为两类:

单列索引:以该表的单个列,生成的索引树,就称为该表的单列索引

组合索引:以该表的多个列组合,一起生成的索引树,就称为该表的组合索引。

单列索引又有具体细的划分:

主键索引:以该表主键生成的索引树,就称为该表的主键索引。

唯一索引:以该表唯一列生成的索引树,就称为该表的唯一索引。

普通索引:以该表的普通列(非主键,非唯一列)生成的索引树,就称为该表的普通索引。

14、索引是个什么样的数据结构呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/61646700601aa7e2ef5e32a88abe4f85.html