mysql
- 关系型数据库
- 默认端口号:3306
存储引擎
- 5.7 默认的存储引擎是InnoDB
- 具有事务、回滚和崩溃修复能力的事务安全型表
- 支持行级锁、表级锁
- 支持外键
- 支持MVCC
- 5.5及以前默认的存储引擎是MyISAM
- 不支持事物、行级锁
- 崩溃后无法安全恢复
- 性能极佳
索引
- 哈希索引
- 场景:绝大部分需求为单条记录查询
- BTree索引
- 适合大部分场景
- b+树
- MyISAM(非聚簇索引)
- B+Tree叶节点的data域存放的是数据记录的地址
- 索引文件和数据文件是分离的
- InnoDB(聚簇索引)
- 其数据文件本身就是索引文件(表数据文件本身就是主索引)
- 辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方
- 树的叶节点data域保存了完整的数据记录
- 索引的key是数据表的主键
- 在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引
- MyISAM(非聚簇索引)
事物
-
事务是逻辑上的一组操作,要么都执行,要么都不执行。
-
四大特性
- 原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
- 一致性(Consistency): 执行事务后,数据库从一个正确的状态变化到另一个正确的状态;
- 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
- 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
-
并发事物带来的问题
- 脏读:一个事物读到了另一个事物修改前的数据
- 丢失修改:两个事物同时对一个数据进行修改操作,其中一个事物的修改没有产生作用(被覆盖)
- 不可重复读:一个事物重复(两次或多次)读取同一数据的期间数据被更改,导致两次读取的结果不一致。
- 幻读:一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录
事物隔离级别
-
读取未提交
- 允许读取尚未提交的数据变更
- 可能会导致:脏读、幻读、不可重复读
-
读取已提交
- 允许读取并发事务已经提交的数据
- 可能会导致:幻读、不可重复读
-
可重复读(**MySQL InnoDB 存储引擎的默认支持的隔离级别 **)
-
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改
-
可能会导致:幻读
-
-
可串行化
-
所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰
-
可能导致:无
-
MySQL InnoDB :可重复读+Next-Key Lock 锁算法(避免幻读)
锁
- 表级锁: MySQL中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。
- 行级锁: MySQL中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。
innoDB锁算法
-
Record lock:
- 单个行记录上的锁
-
Gap lock:
-
间隙锁,锁定一个范围,不包括记录本身
-
阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生
-
-
Next-key lock:
- record+gap
- 锁定一个范围,包含记录本身
- innodb对于行的查询时使用,为解决幻读
- 当查询的索引含有唯一属性时,将next-key lock降级为record key