MySQL | 浅谈范式、索引和事务

范式的概念

数据库最基础的内容,首先是范式的概念。

什么是范式呢?英文名称应该是Normal Form。常见的范式包括3种模式,分别是第一范式,第二范式和第三范式。

第一范式要求数据库中的所有键都是不可拆分的,第二范式要求所有的非主键都必须完全依赖主键,即主键如果是联合主键的话,其中的任一主键都必须被依赖,当然符合第一范式的单主键必然符合第二范式。

第三范式则要求所有的非主键都必须要直接依赖主键,而不能间接依赖。

反范式的设计

一般数据库的设计,都会要求按照3范式来设计。但是在一些情况下,也会使用反范式的设计模式。因为这样设计可以加入冗余,利用“空间换时间”的思想,提高数据查询性能和减少复杂的级联操作。当然,只有在数据库查询性能成为瓶颈时,才会使用反范式的设计。

在日常的项目操作中,会将反范式的做法运用到缓存表和汇总表的设计中。这2种设计表中都是会使用到冗余数据,以减少对主表的访问次数,提高查询性能。

如果要设计一个高并发的Mysql计数表,会用到下面几个方案:

  1. 使用Redis的分布式锁

  2. 使用分区表,根据插入数据的某个值来做哈希值,并且根据相同而规则对表进行分表。

索引

MySQL中的索引是重要的一块,关系到一个数据库能否较好地发挥性能。索引是一种帮助快速查询到数据的数据结构根据数据结构可分为B+树索引、Hash索引和全文索引。根据物理存储分类可以分为聚簇索引和非聚簇索引(二级索引和辅助索引)。

聚簇索引是以表的主键构造的B+树,叶子节点放整行数据。而二级索引的结构也是B+树,叶子节点包含键值和书签,书签指向的聚簇索引的键。如果不是联合索引,则需要回表操作。如果是联合索引,而且包含了需要的主键,那就不需要回表,即覆盖索引

复合索引的匹配,用到了最佳左前缀法则,即按联合索引的第一个列排序。

索引优化方案

为了构建一个高效的索引,需要注意下面3个方面:

  • 索引列的类型尽量小,比如使用int型,可以节省存储空间。

  • 使用选择性高的索引列,就是不重复的索引值比较高的列,即区分性高。比如年龄就比性别的选择性高。

  • 针对长字段,创建前缀索引,即只针对字段的前几位来创建索引。缺点是无法使用orderby和group by等操作。

事务

事务在数据库中是一个很重要的概念,它表示了一个数据库管理系统中的一个逻辑单位,包含一系列的数据库操作序列,要么全部成功,要么全部失败。

事务具有ACID四大属性,分别是:

  • 原子性:要么都成功,要么都失败

  • 一致性:数据库的状态是从一种一致性的状态到另一种一致性的状态

  • 隔离性:事务的执行不能被其他事务的执行所干扰。

  • 持续性:一旦事务提交,对数据库的修改是永久的。

在不同的隔离级别下,事务会存在以下的并发问题

  1. 脏读:当前事务读到其他事务尚未提交的数据

  2. 不可重复读:同一个事务中,两次读取同一数据,但是获取到不同的数据。

  3. 幻读:再次读取同一批数据,但是发现插入了新数据。

为了解决这些问题,MySQl设计了四种事务的隔离级别,分别是

  1. READ UNCOMMITED(读未提交):会产生脏读不可重复读和幻读问题

  2. READ COMMITED(读已提交):不会产生脏读

  3. REPEATABLE READ(重复读,MySQL中的默认隔离级别):不会产生脏读和不可重复读

  4. SERIALIZABLE(可重复读):不会产生脏读,不可重复读和幻读。

在MySQL中,可以使用以下语句来改变事务的隔离级别:

SET GLOBAL TRANSACTION ISOLATION LEVEL 【READ UNCOMMITED / REPEATABLE READ...】

MVCC

MVCC全称是多版本并发控制,通过在数据行后面加上一个版本号,MVCC利用版本链记录数据的多个版本,保存数据的多个版本,事务在读取数据时读取快照版本,MySQL中使用MVCC解决了脏读以上的问题。

MySQL中存在很多的锁,这些锁可以用来解决并发问题。锁有以下4种类型:

  • 共享锁(S锁):允许事务读取一条记录,但不允许修改。

  • 排他锁(X锁):允许事务修改一条记录,并阻塞其他事务的读取和修改。

  • 意向共享锁(IS锁):表级锁,避免遍历所有行

  • 意向独占锁(IX锁):表级锁,避免遍历所有行

根据锁的粒度,可以分为行锁和表级锁。其中表锁的代表是意向锁,可以使用SELECT ... LOCK IN SHARE MODE为读取的记录加共享锁,避免遍历所有行。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值