让开发
成为一种享受!

2020 MySQL 面试题整理

事务四大特性

  • 原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态
  • 一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;
  • 隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
  • 持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。

事务隔离级别

  • 读未提交(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据
  • 读已提交(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。
  • 可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。
  • 串行化(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞MySQL数据库(InnoDB引擎)默认使用可重复读( Repeatable read)

脏读、不可重复读、幻读

  • 脏读: 是指事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
  • 不可重复读 :是指在数据库访问时,一个事务范围内的两次相同查询却返回了不同数据。在一个事务内多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
  • 幻读: 是指当事务不是独立执行时发生的一种现象,比如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么就会发生,操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

不可重复读 & 幻读区别

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。

索引分类

  • index:普通索引,数据可以重复,没有任何限制。
  • unique:唯一索引,要求索引列的值必须唯一,但允许有空值;如果是组合索引,那么列值的组合必须唯一。
  • primary key:主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的同时创建主键索引。
  • 组合索引:在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
  • fulltext:全文索引,是对于大表的文本域:char,varchar,text列才能创建全文索引,主要用于查找文本中的关键字,并不是直接与索引中的值进行比较。fulltext更像是一个搜索引擎,配合match against操作使用,而不是一般的where语句加like。 注:全文索引目前只有MyISAM存储引擎支持全文索引,InnoDB引擎5.6以下版本还不支持全文索引

  所有存储引擎对每个表至少支持16个索引,总索引长度至少为256字节,索引有两种存储类型,包括B型树索引和哈希索引。

  索引可以提高查询的速度,但是创建和维护索引需要耗费时间,同时也会影响插入的速度,如果需要插入大量的数据时,最好是先删除索引,插入数据后再建立索引。   

数据库三范式

  • 第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
  • 第二范式:2NF是在满足第一范式的前提下,非主键字段不能出现部分依赖主键;解决:消除复合主键就可避免出现部分依赖,可增加单列关键字。
  • 第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖。解决:将一个实体信息的数据放在一个表内实现。

存储引擎MyISAM和InnoDB区别

  • InnoDB支持事务,MyISAM不支持。
  • MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。
  • InnoDB支持外键,MyISAM不支持。
  • 从MySQL5.5以后,InnoDB是默认引擎。
  • InnoDB中不保存表的总行数,InnoDB需要扫描整个表计算有多少行,但MyISAM只需简单读出保存好的总行数即可。
  • 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。
  • 清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。
  • InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’)
  • Myisam创建表生成三个文件:.frm 数据表结构 、 .myd 数据文件 、 .myi 索引文件,Innodb只生成一个 .frm文件,数据存放在ibdata1.log

delete、truncate、drop区别

  • truncate和delete只删除数据,不删除表结构 ,drop删除表结构,并且释放所占的空间。
  • 删除数据的速度,drop> truncate > delete
  • delete属于DML语言,需要事务管理,commit之后才能生效。drop和truncate属于DDL语言,操作立刻生效,不可回滚。使用场合: 当你不再需要该表时, 用 drop; 当你仍要保留该表,但要删除所有记录时, 用 truncate; 当你要删除部分记录时(always with a where clause), 用 delete.

MySQL主从复制原理流程

  • 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
  • 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中;
  • 从:sql执行线程——执行relay log中的语句;

InnoDB有哪些类型的日志

  • 错误日志:记录出错信息,也记录一些警告信息或者正确的信息
  • 查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行
  • 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中
  • 二进制日志:记录对数据库执行更改的所有操作(binlog)
  • 中继日志:从库去同步主库的一个中间文件
  • 事务日志:redolog(Innodb自带的重做日志)

自增主键最大ID记录,MyISAM和InnoDB分别是如何存储的

  • MyISAM表把自增主键的最大ID记录到数据文件里
  • InnoDB表把自增主键的最大ID记录到内存中

与Oracle相比,Mysql有什么优势

  • Mysql是开源软件,随时可用,无需付费。
  • Mysql是便携式的
  • 带有命令提示符的GUI。
  • 使用Mysql查询浏览器支持管理

如何区分FLOAT和DOUBLE

  • 浮点数以8位精度存储在FLOAT中,并且有四个字节。
  • 浮点数存储在DOUBLE中,精度为18位,有八个字节。

myisamchk是用来做什么的

它用来压缩MyISAM表,这减少了磁盘或内存使用。

LIKE声明中的%和_是什么意思

%对应于0个或更多字符,_只是LIKE语句中的一个字符。

Mysql如何优化DISTINCT?

DISTINCT在所有列上转换为GROUP BY,并与ORDER BY子句结合使用。

可以使用多少列创建索引

任何标准表最多可以创建16个索引列。

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

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。CURRENT_DATE()仅显示当前年份,月份和日期。

MySQL表中允许有多少个TRIGGERS?

在 MySQL表中允许有六个触发器,如下: BEFORE INSERT AFTER INSERT BEFORE UPDATE AFTER UPDATE BEFORE DELETE AFTER DELETE

MySQL中有哪几种锁?

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

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

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

MySQL索引的注意事项

扫码关注公众号:Java开发乐园

在聊天窗口回复:vip

输入验证码,即可永久解锁本站全部文章

扫码关注【Java开发乐园】

Java开发乐园

扫码关注【东方】

微信:东方

验证码:
赞(2) 打赏
转载请注明出处:Java开发乐园 » 2020 MySQL 面试题整理

来评论一下嘛~ 抢沙发

评论前必须登录!

 

我愿终生等候,换你刹那凝眸

留点🐾印

打赏即是一种肯定,谢谢您的肯定

支付宝扫一扫打赏

微信扫一扫打赏