MySQL面试篇


MYSQL基础:https://www.cnblogs.com/TD1900/p/12121247.html

Mysql 的技术特点是什么

Mysql 数据库软件是一个客户端或服务器系统,其中包括:支持各种客户端程序和库的

多线程 SQL 服务器、不同的后端、广泛的应用程序编程接口和管理工具。

与 Oracle 相比,Mysql 有什么优势?

Mysql 是开源软件,随时可用,无需付费。

Mysql 是便携式的,带有命令提示符的 GUI。

使用 Mysql 查询浏览器支持管理.

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

CHAR 和 VARCHAR 的区别?

  • varchar 与 char 的区别: char 是一种固定长度的类型,varchar 则是 一种可变长度的类型.
  • varchar(50)中 50 的涵义 : 最多存放 50 个字节

Mysql 中有哪几种锁?

MyISAM 支持表锁,InnoDB 支持表锁和行锁,默认为行锁

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低

行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高

MySQL InnoDB 引擎的行锁是通过加在什么上实现的?

InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这 种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级 锁,否则,InnoDB 将使用表锁!

数据库的三大范式

  • 第一范式(1NF):每个属性都是不可分割的原子类型,不可再分割;每个字段只能存储一个值;每张表只能有一个主键;不能有重复的列。
  • 第二范式(2NF):除了主键外,每个列都依赖主键;表中没有部分依赖;表中没有传递依赖。
  • 第三范式(3NF):每个列只依赖主键;表中没有传递依赖;表中没有更多的冗余数据。

索引的优缺点

优点:

  • 加快数据检索的速度
  • 随机I/O编程顺序I/O(B+树的叶子节点用链表连在一起)
  • 加速表与表之间的连接

缺点:

  • 空间:建立索引需要占用物理空间
  • 时间:创建和维护索引需要花费时间,增删改数据导致索引需要动态维护,效率低

什么是最左匹配原则?

最左匹配原则:从最左边为起点开始连续匹配,遇到范围查询(<、>、between、like)会停止匹配。

例如建立索引(a,b,c),大家可以猜测以下几种情况是否用到了索引。

  • 第一种
select * from table_name where a = 1 and b = 2 and c = 3
select * from table_name where b = 2 and a = 1 and c = 3

上面两次查询过程中所有值都用到了索引,where后面字段调换不会影响查询结果,因为MySQL中的优化器会自动优化查询顺序。

  • 第二种
select * from table_name where a = 1
select * from table_name where a = 1 and b = 2
select * from table_name where a = 1 and b = 2 and c = 3

答案是三个查询语句都用到了索引,因为三个语句都是从最左开始匹配的。

索引在什么情况下会失效?

在上面介绍了几种不符合最左匹配原则的情况会导致索引失效,除此之外,以下这几种情况也会导致索引失效。

  • 条件中有or,例如select * from table_name where a = 1 or b = 3
  • 在索引上进行计算会导致索引失效,例如select * from table_name where a + 1 = 2
  • 在索引的类型上进行数据类型的隐形转换,会导致索引失效,例如字符串一定要加引号,假设select * from table_name where a = ‘1’会使用到索引,如果写成select * fromtable_name where a = 1则会导致索引失效。
  • 在索引中使用函数会导致索引失效,例如select * from table_name where abs(a)= 1·在使用like查询时以%开头会导致索引失效
  • 索引上使用!、=、<>进行判断时会导致索引失效,例如select * from table_name where a!=1
  • 索引字段上使用is null/is not null判断时会导致索引失效,例如select * from table_name where a is null

什么是MVCC?

MVCC(multiple version concurrent control)是一种控制并发的方法,主要用来提高数据库的并发性能
在了解MVCC时应该先了解当前读和快照读。

  • 当前读:读取的是数据库的最新版本,并且在读取时要保证其他事务不会修该当前记录,所以会对读取的记录加锁。
  • 快照读:不加锁读取操作即为快照读,使用MVCC来读取快照中的数据,避免加锁带来的性能损耗。
    可以看到MVCC的作用就是在不加锁的情况下,解决数据库读写冲突问题,并且解决脏读、幻读、不可重复读等问题,但是不能解决丢失修改问题。

  目录