164. 数据库的三范式是什么?mysql
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。算法
第二范式:要求实体的属性彻底依赖于主关键字。所谓彻底依赖是指不能存在仅依赖主关键字一部分的属性。sql
第三范式:任何非主属性不依赖于其它非主属性。数据库
165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?性能优化
表类型若是是 MyISAM ,那 id 就是 18。数据结构
表类型若是是 InnoDB,那 id 就是 15。并发
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 字节。
double 最可能够存储 16 位的十进制数,并在内存中占 8 字节。
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:可重复读,默认级别,保证屡次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会形成幻读)。
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
脏读 :表示一个事务可以读取另外一个事务中还未提交的数据。好比,某个事务尝试插入记录 A,此时该事务还未提交,而后另外一个事务尝试读取到了记录 A。
不可重复读 :是指在一个事务内,屡次读同一数据。
幻读 :指同一个事务内屡次查询返回的结果集不同。好比同一个事务 A 第一次查询时候有 n 条记录,可是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的缘由也是另一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,全部数据行的记录就变多或者变少了。
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 *,列出须要查询的字段。
垂直分割分表。
选择正确的存储引擎。