MySQL
- 主键超键候选键外键
- 数据库事务的四个特性及含义
- 原子性:要么全部成功,要么全部失败
- 一致性:执行前和执行后必须处于一致性状态
- 隔离性:多并发事务之间相互隔离
- 持久性:事务提交后,数据的改变是永久性的
- 隔离级别,为什么使用隔离级别?
- 由低到高一次为Read uncommitted(未授权读取,读未提交)、Read committed(授权读取,都提交)、Repeatable Read(可重复读)、 Serializable(序列化), 这四个级别可以逐个解释为 :脏读、不可重复读、幻读。
- Read uncommitted(读未提交):如果一个事务已经开始写数据,则另一个事务则不允许进行写操作,但允许其他事务读此行数据。也就是说事务B读取了事务A未提交的数据。
- Read Committed(读提交):读取数据的事务允许其他事务继续访问改行数据,但未提交的写事务将会禁止其他事务访问该行。避免了脏读,但可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
- Repeatable Read(可重复读):同一个事务内,可多次读同一数据。
- Serializable(序列化):事务序列化执行
隔离级别 |
脏读 |
不可重复读 |
幻读 |
第一类丢失更新 |
第二类丢失更新 |
Read UnCommitted |
允许 |
允许 |
允许 |
不允许 |
允许 |
Read Committed |
不允许 |
允许 |
允许 |
不允许 |
允许 |
Repeatable Read |
不允许 |
不允许 |
允许 |
不允许 |
不允许 |
Serialiable |
不允许 |
不允许 |
不允许 |
不允许 |
不允许 |
- 视图的作用,视图可以更改么?
- 是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储
- 单表视图一般用于查询和修改,会改变基本表的数据
- 多表视图一般用于查询,不会改变基本表的数据
- 作用:
- 简化了操作,把经常使用的数据定义为视图
- 安全性,用户只能查询和修改能看到的数据
- 逻辑上的独立性,屏蔽了真实表的结构带来的影响
- drop,delete与truncate的区别
- drop 直接删掉表
- truncate删除的是表中的数据,再插入数据时自增长的数据id有重新从1开始
- delete删除表中数据,可以后接where语句
- 索引的工作原理及其种类
- 索引的实现通常使用B树及其变种B+树
- 使用索引来聚集数据的索引是聚集索引,InnoDB就是聚集索引,MyISAM是非聚集索引。 MyISAM创建表时会创建三个文件:.frm(表结构) .MYD(数据文件) .MYI(索引文件)。 InnoDB创建表时生成两个文件: .frm(表结构) .idb(数据文件)
- 聚集索引与辅助索引不同的是:叶子节点存放的是否是一整行的信息
- 聚集索引:按照每张表的主键构造一棵B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚集索引的叶子结点称为数据页。每个数据页都通过一个双向链表来进行链接。
- 好处:对主键的排序查找和范围查找速度非常快,叶子结点的数据就是用户所要查询的数据
- 范围查询,由于B+树索引是双向链表,通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据页即可。
- 辅助索引:叶子节点存放的是对应的那条数据的主键字段的值
- 覆盖索引:在辅助索引的叶子结点上就能找到想要的数据,称为覆盖索引
- 分类:
- hash类型的索引:查询单条快,范围查询慢
- btree类型的索引:B+树,层数越多,数量级指数增长
- 连接的种类
- 内连接(Inner join): 两个表都存在匹配时,才返回行
- 左连接(left join): 返回左表中的所有行,即使右表中没有匹配的行
- 右连接(Right join): 返回右表中的所有行,即使左表中没有匹配的行
- 全连接(Full join): 只要某一个表存在匹配,就返回行
- 笛卡尔连接(Cartesian Join): 返回多表中记录集的笛卡尔积
- 数据库范式
- 1NF第一范式:
- 每一列属性都是不可再分的属性值,确保每一列的原子性
- 两列的属性相近或者相似或一样,尽量个兵属性一样的列,确保不产生冗余数据
- 2NF第二范式:
- 每一行的数据只能与其中一列相关,即一行数据只做一件事,只要数据列中出现数据重复,就要把表拆分开来
- 3NF第三范式:
- 数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系
- 数据库优化的思路
- 高并发读写操作: 集群,分布式
- 海量数据读写: 分表,分库
- 单机慢查询优化
- 范式规范,3NF和反3NF
- 存储引擎选择:
- 事务安全:MyISAM不支持,InnoDB支持
- 查询和添加速度:MyISAM快,InnoDB慢
- 全文索引:MyISAM支持, InnoDB不支持
- 锁机制:MyISAM表锁,InnoDB行锁
- 外键:MyISAM不支持,InnoDB支持
- 索引:以空间换时间
- 分类
- 适合加索引条件
- 较频繁作为查询条件字段应该创建索引
- 唯一性太差字段不适合单独创建索引
- 更新非常频繁的字段不适合创建索引
- 分表: 水平分割(行)垂直分割(列)
- 分区:
- 方式:
- Range(范围):基于一个给定的连续空间,把数据分配到不同分区
- List(预定义列表):类型Range分区,区别在于是基于枚举出的值列表分区。
- Hash: 通过一个或者多个列的Hash Key进行计算得到的不同数值进行分区
- Key:Hash的特例,MySQL系统产生的
- Composite(复合模式): 以上模式的组合使用
- 空值的处理:
- Range: 默认放入最小值分区
- List: 必须指定Null值匹配
- Hash:默认当成0
- DQL:
- 放弃索引: != <> is null or in not like模糊前置匹配
- 集群:主从同步+读写分离+主备切换
- 分布式:
- 缓存:
- 存储过程与触发器的区别
- 存储过程是一组已创建并存储在数据库中的SQL语句,可重用。 触发器是一种特殊的不是由用户直接调用的存储过程。
- 用户可以使用Execute或Exec语句直接调用或执行存储过程,而无法直接调用执行触发器,触发相关事件时,自动执行。
- 存储过程可输入参数,触发器不能
- 存储过程可返回值,触发器不能
- 存储过程中可以使用事务,触发器不允许进行事务处理
- 存储过程通过用于执行用户指定的任务,触发器通常用于审计工作