《Mysql-十问十答》
1. 数据库的三范式?
1). 第一范式(1NF):字段具有原子性,不可再分。即: 数据库表的每一个字段都是不可分割的。
(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
2). 第二范式(2NF): 数据库表中的非主属性只依赖于主键。
2NF是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
3). 满足第三范式(3NF)不存在非主属性对关键字的传递函数依赖关系。
3NF必须先满足第二范式(2NF)。第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
a. 每一列只有一个值
b. 每一行都能区分。
c. 每一个表都不包含其他表已经包含的非主关键字信息。
2. Mysql索引工作机制?
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
InnoDB底层存储结构为B+树,B树的每个节点对应innodb的一个page,page大小是固定的,一般设为16k。其中非叶子节点只有键值,叶子节点包含完成数据。
而B+树是B树的升级版,把非叶子节点冗余一下,这么做的好处是为了提高范围查找的效率。
3. Mysql复制原理以及流程。
1) 原理
一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。
当一个从服务器连接主服务器时,它通知主服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
2) 流程
a) 主服务器把更新记录到二进制日志文件中。
b) 从服务器把主服务器的二进制日志拷贝到自己的中继日志(replay log)中。
c) 从服务器重做中继日志中的时间,把更新应用到自己的数据库上。
4. Mysql支持的复制类型?
1) 基于语句的复制
在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。
2) 基于行的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
3) 混合类型的复制
默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
5. Mysql存储引擎
1) MyISAM
优化: 系统读多写少,对原子性要求低,则MyISAM是较好的选择,且MyISAM恢复速度快,可直接用备份覆盖恢复。支持全文搜索。
缺点: 不支持行锁,不支持外键,不支持事务,回滚将造成不完全回滚,不具有原子性。
2) InnoDB
优化: Mysql默认引擎InnoDB。支持行锁、支持外键、支持事务处理、不加锁读取。并发写入高的时候InnoDB是首选。
缺点: 不保存表的具体行数,扫描表来计算有多少行。DELETE 表时,是一行一行的删除。
3) Memory
优化: 使用存在内存中的内容来创建表。Memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引。
每个memory表实际只对应一个磁盘文件,格式是.frm。
缺点: 服务关闭,表中的数据就会丢失掉。
4) Merge
Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,Merge表本身并没有数据。
6. InnoDB支持的四种事务隔离级别
1) Read Uncommitted (读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)。
2) Read Committed (读取提交内容)
一个事务只能看见已经提交事务所做的改变。同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
3) Repeatable Read (可重读)
MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
可能存在幻读(PhantomRead),幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
4) Serializable(串行化)
最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
它是在每个读的数据行上加上共享锁,在这个级别,可能导致大量的超时现象和锁竞争。
7. MVCC简述及实现原理
1)简述
Mysql InnoDB存储引擎基于Multi-Version Concurrency Control (MVCC,多版本的并发控制协议)实现。
MVCC是通过保存数据在某个时间点的快照来实现的。优点是:读不加锁,读写不冲突;缺点是: 每行记录额外的存储空间
MVCC是一种并发控制的方法,是乐观锁的一种实现方式,一般在数据库管理系统中,实现对数据库的并发访问。
2) 实现原理
MVCC是通过在每行记录中保存两个隐藏的列来实现的,创建事物id,删除事物id。
每开始一个新的事务,系统版本号(可以理解为事务的ID)就会自动递增,事务开始时刻的系统版本号会作为事务的ID。
Innodb的最基本行记录(row)中包含一些额外的存储信息:DATA_TRX_ID,DATA_ROLL_PTR,DB_ROW_ID,DELETE BIT。
3)其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。
8.mysql中varchar与char的区别以及varchar(30)中的30代表的涵义?
1) CHAR列长度固定为创建表时声明的长度,长度值范围是1到255;varchar则是一种可变长度的类型。
2) 当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
3) varchar(30)表示最多存放30个字节
9. 数据库事务ACID属性
1) 原子性Atomicity
事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。
2) 一致性Consistency
当事务完成时,数据必须处于一致状态。
3) 隔离性Isolation
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
4) 永久性Durability
事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。
10.NOW()和CURRENT_DATE()有什么区别?
1) NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。
SELECT NOW() FROM DUAL; -- 输出2019-07-03 15:14:45
2) CURRENT_DATE()仅显示当前年份,月份和日期。
SELECT CURRENT_DATE() FROM DUAL; -- 输出2019-07-03