长期收集MySQL相关面试题,长期更新。

1.一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?

(1)如果表的类型是 MyISAM,那么是 18
因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里,重启 MySQL 自增主键的最大,ID 也不会丢失
(2)如果表的类型是 InnoDB,那么是 15
InnoDB 表只是把自增主键的最大 ID 记录到内存中,所以重启数据库或者是对表进行OPTIMIZE (优化)操作,都会导致最大 ID 丢失

PS:MySQL8.0优化了这个问题,InnoDB也不会丢失最大ID。

2.MySQL 服务器默认端口是什么?

3306

3.与 Oracle 相比,MySQL 有什么优势?

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

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

使用 MySQL查询浏览器支持管理 。

4.MySQL 中 InnoDB 的事务隔离级别名称,以及逐级之间的区别?

read uncommitted:读未提交;可以读取到未提交的事务,存在数据脏读。

read committed:读已提交;可以读取到已经提交的事务,导致不可重复读问题。

repeatable read:可重复读; MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行;不过从理论上诞生了另一个更棘手的问题“幻读”。

serializable:串行化;最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题;存在大量锁竞争,并发度低。

5.CHAR 和 VARCHAR 的区别?

以下是 CHAR 和 VARCHAR 的区别:

CHAR 和 VARCHAR 类型在存储和检索方面有所不同

CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255

当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。

6.如何获取当前的 MySQL版本

SELECT VERSION();

7.NOW()和 CURRENT_DATE()有什么区别?

NOW 是年,月,日,时,分,秒
CURRENT_DATE 是年,月,日

8.如何使用命令行登录MySQL?

./bin/mysql -h HOST地址 -u 用户名 -p 密码

9. 列设置为AUTO_INCREMENT时,达到最大值将会发生什么,该怎么办?

  1. 表的⾃增id达到上限后,再申请时它的值就不会改变,进⽽导致继续插⼊数据时报主键冲突的错误。

  2. 没有主键的表,数据库会创建隐藏主键row_id,row_id达到上限后,则会归0再重新递增,如果出现相同的row_id,后写的数据会覆盖之前的数据。

方法:

1.如果使用有符号int,可以改成无符号int;长度增加一倍。

2.int类型改成bigint类型

3.业务梳理,分库分表

10.如何查看某个表的现有索引

show index from Table_Name;

11.MySQL 查询是否区分大小写

查询不区分,表名可以根据需要设置lower_case_table_names是否区分;

①设置lower_case_table_names参数进行对表名称或数据库名称大小写敏感的控制。

②Unix下默认为0,也就是大小写敏感的;Windows下默认为1,不敏感;macOS默认为2,存储区分大小写,但是在查询时会转换为小写。

③对于在大小写不敏感的系统(Windows和macOS)不能将该字段设置为0。

12.如何显示前50行数据

select * from t limit 0,50;

13.MySQL主从复制的原理

binlog dump线程

当slave连接到master的时候,master机器会为slave开启binlog dump线程。当master 的 binlog发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。

在slave机器上的操作

当主从同步开启的时候,slave上会创建2个线程。

  • I/O线程。该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log。
  • SQL线程。该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。

14. 什么是索引?

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

15.索引有哪几种类型?

主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。

唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。

普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值

组合索引: 将多个字段组合创建一个索引,没有唯一性的限制,允许为NULL值

全文索引: 是目前搜索引擎使用的一种关键技术 InnoDB在MySQL5.6开始支持。

ALTER TABLE table_name ADD FULLTEXT INDEX(column);

16.索引常用的算法有哪些?

索引算法有BTree算法和Hash算法

BTree算法

BTree是常用的mysql数据库索引算法,也是mysql默认的算法。因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量,例如:

1	‐‐只要它的查询条件是一个不以通配符开头的常量
2	select*fromuserwherenamelike'jack%';
3	‐‐如果一通配符开头,或者没有使用常量,则不会使用索引,例如:
4	select*fromuserwherenamelike'%jack';

Hash算法

HashHash索引只能用于对等比较,等值查询。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。

17.MySQL的binlog有有几种录入格式?

有三种格式,分别是:statement,row,mixed

  • statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。

  • row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如altertable),因此这种模式的文件保存的信息太多,日志量太大。

  • mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。

18. 什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,事务是逻辑上的一组操作,要么都执行,要么都不执行;其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。

事务最经典也经常被拿出来说例子就是转账了。

假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

19.事务的特性?

关系性数据库需要遵循ACID规则,具体内容如下:

  1. 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作
    要么全部完成,要么完全不起作用;

  2. 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的
    结果是相同的;

  3. 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各
    并发事务之间数据库是独立的;

  4. 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

20.InnoDB中ACID事务的特性是如何保证的?

  1. 原子行通过undo log 保证。

  2. 持久性是有其他三个特性来共同保证的。

  3. 隔离性是有MVCC来保证的。

  4. 持久性是有redo log 来保证的。

21.什么是脏读?幻读?不可重复读?

这个应该配合数据库的隔离级别来讲,隔离级别分别是:读未提交,读已提交,可重复读,串行化;

脏读(Drity Read):是在读未提交是产生,读取到其他事务未提交的数据,即脏数据。

不可重复读(Non-repeatable read):读取到其他事务已经提交的数据,导致前后两次读取的结果不一致,称为不可重复读。

幻读(Phantom Read): 在可重复读级别小,有可能会产生幻读;在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

比如:A事务中读取大于5的数据有3条,B事务插入了一条,提交,A事务再次查询大于5的数据发现是4条,就产生了幻读。

InnoDB解决幻读的策略是MVCC和间隙锁。

22.什么是MVCC,是如何实现的

MVCC 全称是Multi Version Concurrent Control ,多版本并发控制,它主要是通过undo log,三个隐藏字段,还有ReadView来实现的。

三个隐藏字段:DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID

当前读:读取的是最新的数据状态,会加X锁,保证其他事务不能对当前记录做修改。

快照读:读取时的数据记录快照,有可能是历史版本的,与最新的状态不一致。