数据库的隔离级别和索引使用

先看一下隔离级别, 隔离级别首先要明确 ,隔离的越重,那么自然会失去效率,为什么有这么多的隔离级别,其实就是平衡业务关系尽可能的提高效率。

下面看下隔离级别和介绍:

读未提交是指:一个事务还没提交时,它做的变更就能被别的事务看到。

读提交是指:一个事务提交之后,它做的变更才会被其他事务看到。

可重复读是指:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

串行化:顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。其中“读提交”和“可重复读”比较难理解,所以我用一个例子说明这几种隔离级别。假设数据表 T 中只有一列,其中一行的值为 1,下面是按照时间顺序执行两个事务的行为

假如 mysql 修改(update) age 这个这个字段 ,由age 36 修改为 18

首先1.启动事物 2,修改值  3 commit(提交事物 )整个过程结束。

那么当另外一个事物正好访问age 这个修改的字段是 改怎么处理呢。

读提交 :必须等修改的事物 commit 提交之后才能访问,也就是 在没有修改事物提交之前还是访问的36 

读未提交: 表示 我可以等你不提交,就能读到数据,那么这个时候读到的数据就是18 (虽然修改事物没有提交)

可重复读,表示 我这个读事物前后一致,也就是说我读事物在没有提交之前 读到什么数据 就一直是什么数据,(读事物没有commit之前)

串行化: 当一个事物会加锁,执行完之后 另外一个事物才能执行。当 查询事物commit 之后 修改事物才能执行,或者当修改事物commit 之后 查询事物才能执行。

再说一下索引:

mysql 数据库大部分用的是innoDB,见索引要注意回表问题。

先说一下回表, innoDB采用B+树的方式,它分为主键索引(聚簇索引),业务类索引(非聚簇索引),当我们查询一个字段的时候,mysql 会返回主键 然后 再把数据返回,

比如 * where age =18 他会先用age 这个业务索引找到 主键id  然后用主键id 取找出所有查询的数据 这个过程叫回表。

你的 索引设计 如果设计不当很可能会增加 回表的次数 从而影响 查询效率

举例说一下:比如查询 where age =18 and sex =‘男’  你的索引 age 但是sex 没有,

这样的话 按照最左匹配原则,age 是会走索引的,但是sex 没有索引  ,这样就是增加一次回表,即先通过age 查询id 然后 用id 找出数据 看看sex是否符合。

但是如果你 (age, sex) 这样做联合索引 按照 最左匹配原则 你age 首先说可以使用,那么 你在使用查询语句的where age =18 and sex =‘男’   时候,减少了一次回表  (这叫索引下推)

拿怎么设计呢,比如你的业务需求中 关于年龄和性别这两个是高频查询次数,那么就直接设计联合索引,这样还能减少单独设计age 这个索引(索引最左原则)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值