BAT MySQL高频面试题

  • 时间:
  • 来源:互联网
  • 文章标签:

1.事务是什么?

事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:

2.并发访问时,在数据库如何安全地修改同一行数据

  1. 使用悲观锁。MySQL有两种实现方法
select ... for update
select ... lock in share mode 

select … for update 实现方式

set autocommit = 0; //关闭自动提交
begin; //开启事务
select * from user where id = 1 for update; 查询信息
update user set name = '张三'; //修改信息
commit ; //提交事务

执行select … for update 时,一般的 select 查询 则不受影响

lock in share mode 实现方式

set autocommit = 0; //关闭自动提交
begin; //开启事务
select * from user where id =1 lock in share mode;//锁定查询的字段
update user set name = '张三'; //修改信息
commit ; //提交事务

二者区别

  • 前者属于共享锁,允许其他事务添加共享锁,不允许其他事物修改或者加排他锁
  • 后者属于排他锁,不允许其他事物添加共享锁和排他锁,也不允许修改
  1. 使用乐观锁

    采用带版本号(version)更新,相当于CAS思想

3.数据库的三范式是什么?

  • 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
  • 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
  • 第三范式:任何非主属性不依赖于其它非主属性。

❤4.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

表类型如果是 MyISAM ,那 id 就是 8。

  • 因为MyISAM 会把自增主键的最大ID 记录到数据库文件里面,重启MySQL后,自增主键的最大ID也不会丢失。

表类型如果是 InnoDB,那 id 就是 6。

  • 因为如果不重启,这条记录就是8,但是如果重启MySQL 的话,这条记录就是6,因为InnoDB把自增主键的最大ID 记录存在内存中,所以重启会使最大ID丢失

5.如何获取当前数据库版本?

使用 select version() 获取当前 MySQL 数据库版本。

6.说一下ACID是什么

Atomicity(原子性)

  • 一个事务中的所有操作,要么全都执行,要么全都不执行。即,事务不可分割、不可约简。

Consistency(一致性)

  • 在事务开始之前和事务结束之后数据库的完整性没有被破坏。

Isolation(隔离性)

  • 数据库允许多个 并发事务 同时 对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据不一致。
  • 事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

Durability(持久性)

  • 事务处理结束后,对数据的修改是永久的。即便系统出现故障也不会丢失数据

7.char 和 varchar 的区别是什么?

  • char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。

char 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。

  • varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。

所以,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,二者使用需要权衡。

8.float 和 double 的区别是什么?

  • float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。
  • double 最可可以存储 16 位的十进制数,并在内存中占 8 字节。

9.MySQL 的内连接、左连接、右连接有什么区别?

内连接关键字:inner join;左连接:left join;右连接:right join。

内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。

10.MySQL 索引是怎么实现的?

索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。

具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。

11.怎么验证 MySQL 的索引是否满足需求?

使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。

explain 语法:explain select * from table where type=1。

12.说一下数据库的事务隔离?

MySQL 的事务隔离是在 MySQL. ini 配置文件里添加的,在文件的最后添加:

transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

READ-UNCOMMITTED 未提交读,最低隔离级别、事务未提交前,就可以被其他事务读取(会出现幻读、脏读、不可重复读)

READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会出现幻读、不可重复读)

REPEATABLE-READ可重复读,MySQL默认级别,保证多次读取同一个数据时,其值和事务开始时的内容保持一致。禁止读取到别的事务未提交的数据(会造成幻读)

SERIALIZABLE序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

13脏读、不可重复读、幻读分别是什么?

  • 脏读: 表示一个事务读取到另一个事务中还未提交的事务。比如 A尝试插入记录 X ,此时事务还未提交,然后另一个事务尝试读取到了 记录X
  • 不可重复读:指在一个事务内,多次读同一数据
  • 幻读:指同一个事务内多次查询返回结果集不一样。 比如同一个事务 A 第一次查询时候有n 条记录,但是第二次查询的时候有n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增、删除或者修改了第一个事务结果集里面的数据。同一个记录的数据被修改了,所有数据行的记录就变多或者变少了。

14. 说一下 MySQL 常用的引擎?

InnoDB 引擎

  • mysql 5.1 后默认的数据库引擎,提供了对数据库 acid 事务的支持,
  • 并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统
  • MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。
  • 但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表
  • 由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

MyIASM 引擎

  • 不提供事务的支持,也不支持行级锁和外键
  • 因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。
  • 不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。
  • 所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

15.说一下 MySQL 的行锁和表锁?

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

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

    16. 说一下乐观锁和悲观锁?

    乐观锁:

    • 每次去拿数据的时候都认为别人不会修改,所以不会上锁,
    • 但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。

    悲观锁

    • 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。

    实现乐观锁

    • 数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。

17.mysql 问题排查都有哪些手段?

  • 使用 show processlist 命令查看当前所有连接信息。
  • 使用 explain 命令查询 SQL 语句执行计划。
  • 开启慢查询日志,查看慢查询的 SQL。

18. 如何做 mysql 的性能优化?

  • 为搜索字段创建索引。
  • 避免使用 select *,列出需要查询的字段。
  • 垂直分割分表。
  • 选择正确的存储引擎。

本文链接http://www.taodudu.cc/news/show-1781834.html