乐趣区

关于面试:面试MySql

164. 数据库的三范式是什么?165. 一张自增表外面总共有 7 条数据,删除了最初 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?166. 如何获取以后数据库版本?167. 说一下 ACID 是什么?168. char 和 varchar 的区别是什么?169. float 和 double 的区别是什么?170. mysql 的内连贯、左连贯、右连贯有什么区别?171. mysql 索引是怎么实现的?172. 怎么验证 mysql 的索引是否满足需要?173. 说一下数据库的事务隔离?174. 说一下 mysql 罕用的引擎?175. 说一下 mysql 的行锁和表锁?176. 说一下乐观锁和乐观锁?177. mysql 问题排查都有哪些伎俩?178. 如何做 mysql 的性能优化?

MySql

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

范式是“合乎某一种级别的关系模式的汇合,示意一个关系外部各属性之间的分割的合理化水平”

  • 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
    两列的属性相近或类似或一样,尽量合并属性一样的列,确保不产生冗余数据。
  • 第二范式:要求实体的属性齐全依赖于主关键字。所谓齐全依赖是指不能存在仅依赖主关键字一部分的属性。
    每一行的数据只能与其中一列相干,即一行数据只做一件事。只有数据列中呈现数据反复,就要把表拆分开来。
    一个人同时订几个房间,就会呈现一个订单号多条数据,这样子联系人都是反复的,就会造成数据冗余。咱们应该把他拆开来
  • 第三范式:任何非主属性不依赖于其它非主属性。

    数据不能存在传递关系,即每个属性都跟主键有间接关系而不是间接关系。
    比方这样一个表构造 Student 表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
    这样的表构造,咱们应该拆开来,如下。
    (学号,姓名,年龄,所在院校)–(所在院校,院校地址,院校电话)

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

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

InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 失落。

166. 如何获取以后数据库版本?

应用 select version() 获取以后 MySQL 数据库版本。

167. 说一下 ACID 是什么?

  • Atomicity(原子性):一个事务(transaction)中的所有操作,或者全副实现,或者全副不实现,不会完结在两头某个环节。事务在执行过程中产生谬误,会被复原(Rollback)到事务开始前的状态,就像这个事务素来没有执行过一样。即,事务不可分割、不可约简。
  • Consistency(一致性):在事务开始之前和事务完结当前,数据库的完整性没有被毁坏。这示意写入的材料必须完全符合所有的预设束缚、触发器、级联回滚等。
  • Isolation(隔离性):数据库容许多个并发事务同时对其数据进行读写和批改的能力,并发执行的事务彼此无奈看到对方的中间状态,多个并发事务之间要互相隔离 , 隔离性能够避免多个事务并发执行时因为穿插执行而导致数据的不统一。个别 通过乐观或者乐观锁实现
    事务隔离分为不同级别,包含读未提交(Read uncommitted)、读提交(read committed)、可反复读(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事务处理完结后,对数据的批改就是永恒的,即使系统故障也不会失落。

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

char(n):固定长度类型,比方 char(10),当你输出 ”abc” 三个字符的时候,它们占的空间还是 10 个字节,其余 7 个是空字节。

chat 长处:效率高;毛病:占用空间;实用场景:存储明码的 md5 值,固定长度的,应用 char 十分适合。

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

所以,从空间上思考 varcahr 比拟适合;从效率上思考 char 比拟适合,二者应用须要衡量。

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

  • float 最多能够存储 8 位的十进制数,并在内存中占 4 字节。无效数位是 7 位(因为有正负,所以不是 8 位)
  • double 最可能够存储 16 位的十进制数,并在内存中占 8 字节。无效数位是 16 位

170. mysql 的内连贯、左连贯、右连贯有什么区别?

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

内连贯是把匹配的关联数据显示进去;左连贯是右边的表全副显示进去,左边的表显示出符合条件的数据;右连贯正好相同。

171. mysql 索引是怎么实现的?

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

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

172. 怎么验证 mysql 的索引是否满足需要?

应用 explain 查看 SQL 是如何执行查问语句的,从而剖析你的索引是否满足需要。

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

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

MySQL 的事务隔离是在 MySQL. ini 配置文件里增加的,在文件的最初增加:transaction-isolation = REPEATABLE-READ

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

  • READ-UNCOMMITTED:读未提交 ,最低隔离级别, 写事务会禁止其余写事务,但容许其余事务读此行数据。事务未提交前,就可被其余事务读取( 会呈现幻读、脏读、不可反复读)。
  • READ-COMMITTED:读已提交 ,读事务容许其余事务持续拜访该行数据,然而未提交的写事务将会禁止其余事务拜访该行。一个事务提交后能力被其余事务读取到( 会造成幻读、不可反复读)。
  • REPEATABLE-READ:可反复读 ,默认级别, 读事务将会禁止写事务(但容许读事务),写事务则禁止任何其余事务 。可反复读能够解决不可反复读问题。不可反复读对应的是批改,即 UPDATE 操作。然而可能还会有幻读问题。因为幻读问题对应的是插入 INSERT 操作,而不是 UPDATE 操作。( 会呈现幻读)。
  • SERIALIZABLE:序列化 ,代价最高最牢靠的隔离级别,提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行, 不能并发执行。该隔离级别能避免脏读、不可反复读、幻读。

脏读:示意一个事务可能读取另一个事务中还未提交的数据。

不可反复读:一个事务内屡次查问却返回了不同的数据值,这是因为在查问距离,被另一个事务批改并提交了。

幻读:指同一个事务内屡次查问返回的后果集不一样。后一次查问看到了前一次查问没有看到的行数据, 产生幻读的起因也是因为在查问距离,被另一个事务批改并提交了

不可反复读和幻读这两者有些类似, 所不同的是不可反复读针对的是一条数据,而幻读针对的是一个数据整体, 不可反复读重点在于 update 和 delete,而幻读的重点在于 insert。防止不可反复读须要锁行(某一行在 select 操作时,不容许 update 与 delete)就行,防止幻读则须要锁表。

174. 说一下 mysql 罕用的引擎?

InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的反对,并且还提供了行级锁和外键的束缚,它的设计的指标就是解决大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建设缓冲池,用于缓冲数据和索引。然而该引擎是不反对全文搜寻,同时启动也比拟的慢,它是不会保留表的行数的,所以当进行 select count(*) from table 指令的时候,须要进行扫描全表。因为锁的粒度小,写操作是不会锁定全表的, 所以在并发度较高的场景下应用会晋升效率的。

MyIASM 引擎:MySQL 的默认引擎,但不提供事务的反对,也不反对行级锁和外键。因而当执行插入和更新语句时,即执行写操作的时候须要锁定这个表,所以会导致效率会升高。不过和 InnoDB 不同的是,MyIASM 引擎是保留了表的行数,于是当进行 select count(*) from table 语句时,能够间接的读取曾经保留的值而不须要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不须要事务的反对的,能够将 MyIASM 作为数据库引擎的首选。

175. 说一下 mysql 的行锁和表锁?

MyISAM 只反对表锁,InnoDB 反对表锁和行锁,默认为行锁。

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

176. 说一下乐观锁和乐观锁?

  • 乐观锁:每次去拿数据的时候都认为他人不会批改,所以不会上锁,然而在提交更新的时候会判断一下在此期间他人有没有去更新这个数据。
  • 乐观锁:每次去拿数据的时候都认为他人会批改,所以每次在拿数据的时候都会上锁,这样他人想拿这个数据就会阻止,直到这个锁被开释。

数据库的乐观锁须要本人实现,在表外面增加一个 version 字段,每次批改胜利值加 1,这样每次批改的时候先比照一下,本人领有的 version 和数据库当初的 version 是否统一,如果不统一就不批改,这样就实现了乐观锁。

177. mysql 问题排查都有哪些伎俩?

  • 应用 show processlist 命令查看以后所有连贯信息。
  • 应用 explain 命令查问 SQL 语句执行打算。
  • 开启慢查问日志,查看慢查问的 SQL。

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

  • 为搜寻字段创立索引。
  • 防止应用 select *,列出须要查问的字段。
  • 垂直宰割分表。
  • 抉择正确的存储引擎。
退出移动版