MySQL面试题个人总结

91 阅读5分钟

1. MySQL中有哪几种锁?

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁:开销大,加锁慢;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  3. 页面锁:开销和加锁时间界于表锁和行锁;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

2. MySQL中InnoDB支持的四种事务级别名称,以及逐级之间的区别?

隔离级别:

  1. read uncommited :读到未提交数据
  2. read committed:脏读,不可重复读
  3. repeatable read:可重读
  4. serializable :串行事物

3. CHAR和VARCHAR的区别?

  1. CHAR和VARCHAR类型再存储和检索方面有所不同
  2. CHAR列长度固定为创建表时声明的长度,长度值范围是1到255,当CHAR值呗存储时,它们被用空格填充到特定长度,检索CHAR值时需要删除尾随空格。

4. MySQL支持事务吗?

在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。

但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。

5. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。 b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。 c. mysql库主从读写分离。 d. 找规律分表,减少单表中的数据量提高查询速度。 e。添加缓存机制,比如memcached,apc等。 f. 不经常改动的页面,生成静态页面。 g. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

6. 锁的优化策略

  1. 读写分离
  2. 分段加锁
  3. 减少锁持有的时间
  4. 多个线程尽量以相同的顺序去获取资源

不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。

7.索引的底层实现原理和优化

B+树,经过优化的B+树

主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。

8. Sql的优化

  1. SQL语句及索引的优化
  2. 数据库表结构的优化

应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

in 和 not in 也要慎用,否则会导致全表扫描

任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段

尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间

9. 数据库中的事务特性?

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

10. 索引的目的是什么?

快速访问数据表中的特定信息,提高检索速度 创建唯一性索引,保证数据库表中每一行数据的唯一性。 加速表和表之间的连接

11. 解释MySQL外连接、内连接与自连接的区别

内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。 外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中 的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。

左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。

12. Myql中的事务回滚机制概述

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。

要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚

13. 如何通俗地理解三个范式?

第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

14. 索引的优缺点

优点

  • 索引大大减小了服务器需要扫描的数据量
  • 索引可以帮助服务器避免排序和临时表
  • 索引可以将随机IO变成顺序IO
  • 关于InnoDB、索引和锁:InnoDB在二级索引上使用共享锁(读锁),但访问主键索引需要排他锁(写锁)

缺点

  • 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存索引文件。
  • 建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。
  • 如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
  • 对于非常小的表,大部分情况下简单的全表扫描更高效;

15. B-Tree索引

InnoDB使用的是B+Tree。 B+Tree:每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。

B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同,很适合查找范围数据。

B-Tree可以对<,<=,=,>,>=,BETWEEN,IN,以及不以通配符开始的LIKE使用索引。

16. MySQL有哪些重要的日志文件?

  1. 错误日志:用来记录MySQL服务器运行过程中的错误信息,默认开启无法关闭。
  2. 查询日志:查询日志里面记录了数据库执行的所有命令,不管语句是否正确,都会被记录。
  3. redo log(重做日志):为了最大程度的避免数据写入时,因为IO瓶颈造成的性能问题
  4. undo log(回滚日志):用于存储日志被修改的值,从而保证如果修改出现异常,可以使用 undo log 日志来实现回滚操作。
  5. bin log(二进制日志):是一个二进制文件,主要记录所有数据库表结构变更,bin log 中记录了对 MySQL 数据库执行更改的所有操作

17. MySql的主从复制和读写分离

目的很简单,就是为了提高数据库的并发性能

原理

①当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。

②从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。

③当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。

④I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。

⑤SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。

读写分离

  1. 采用AOP的方式,通过方法名判断,方法名中有get、select、query开头的则连接slave,其他的则连接master数据库。
  2. 读写分离就可以使用ShardingSphere-JDBC实现。

18.公司每天要进行打卡上班,每个人每天也可以多次打卡,所有打卡信息会记录到表A 中,表A中有name, date, time 等字段。

a. 要统计今天迟到的人的名单,请写出相应的SQL。(20分)

SELECT a.name from a where a.date = NOW() and a.time > '09:00:00'

b. 每月会统计迟到次数排行前十的人的名单,请写出相应的SQL。(20分)

SELECT a.name from a where DATE_FORMAT(date,'%Y%m') =DATE_FORMAT(CURDATE(),'%Y%m');