【题目解析】MySQL

1、数据库的三范式是什么?

  • 第一:强调列的原子性,即数据库表的每一列都是不可分割的原子数据项。
  • 第二:要求实体的属性完全依赖于主关键字。
  • 第三:任何非主属性不依赖于其他非主属性。

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

  • 表类型若是 MyISAM,则 id 为8;
  • 表类型若是 InnoDB,则 id 为6。
  • 因为InnoDB表只会把自增主键的最大id记录在内存中,所以重启之后会导致最大id丢失。

3、如何获取当前数据库版本?

  • 使用select version()获取。

4、说一下 ACID 是什么?

  • ACID是数据库的四个特性;
  • Atomicity 原子性:事务不可分割,不可约简。
  • Consistency 一致性:事务开始前和事务结束后,数据库的完整性没有被破坏。
  • Isolation 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
  • Durability 持久性:事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。

5、char 和 varchar 的区别是什么?

  • char(n):固定长度类型
  • 效率高但是占用空间;适合存储密码的md5值,固定长度的。
  • varchar(n):长度可变的,存储值是每个值占用的字节加上一个用来记录其长度的字节的长度。
  • 空间考虑用varchar,效率上用char

6、float 和 double 的区别是什么?

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

7、mysql 的内连接、左连接、右连接有什么区别?

  • 内连接:inner join;把匹配的关联数据显示。
  • 左连接:left join;把左边的表全显示,右边的表显示出符合条件的数据。
  • 右连接:right join;与左连接相反。

8、mysql 索引是怎么实现的?

  • 索引是用来实现高效查找的。
  • 目前主流的数据库引擎索引都是由 B+ 树实现的,其效率可达到二分法的性能。

9、怎么验证 mysql 的索引是否满足需求?

  • 使用explain查看 SQL是如何执行查询语句的,从而分析索引是否满足需求。
  • 语法: explain select * from table where type = 1。

9、说一下数据库的事务隔离?

  • MySQL的事务隔离是在MySQL.ini 配置文件里添加的,在文件最后添加: transaction-isolation = REPEATABLE-READ
  • 可用配置:
    • READ-UNCOMMITTED:未提交读,最低隔离级别,事务未提交前,就可被其他事务读取(会出现幻读,脏读,不可重复读)
    • READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读,不可重复读)
    • REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值和事务开始时内容一致,禁止读取到别的事务没提交的数据(会造成幻读)
    • SERIALIZABLE:序列化,代价最高最可靠的隔离级别,能防止脏读,不可重复读,幻读。
  • 脏读:表示一个事务能够读取另一个事务中还未提交的数据。
  • 不可重复读:指在一个事务内,多次读同一数据。
  • 幻读:指同一事务内多次查询返回的结果集不同。

10、说一下 mysql 常用的引擎?

  • InnoDB:

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

    • MySQL的默认引擎,但不提供事务支持,也不支持行级锁和外键。
    • 当执行插入和更新语句时,即执行写操作时需要锁定这个表,导致效率降低。
    • 但它保存了表的行数,当进行那条语句时可以直接读取已经保存的值而不用扫描全表。
    • 当表的读操作远大于写操作是,并且不需要事务支持的,可用MyISAM。

11、说一下 mysql 的行锁和表锁?

  • MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。
  • 表级锁:开销小,加锁快,不会出现死锁。锁定力度大,发生锁冲突概率高,并发量最低。
  • 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突概率小,并发度最高。

12、说一下乐观锁和悲观锁?

  • 乐观锁:每次去拿数据都认为别人不会修改,所以不上锁,但在提交更新时会判断在此期间是否有人更新数据。
  • 悲观锁:每次去拿数据都认为别人修改了,所以每次都上锁,这样别人拿回被阻止,知道此锁被释放。

13、mysql 问题排查都有哪些手段?

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

14、如何做 mysql 的性能优化?

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

你可能感兴趣的:(MySQL,题目)