博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql性能优化实战:数据库锁的介绍与索引查找原理
阅读量:4293 次
发布时间:2019-05-27

本文共 779 字,大约阅读时间需要 2 分钟。

疯狂的程序员 2017-10-10 22:23

在上篇文章中说到建议数据库采用InnoDB存储引擎,一个很重要的原因就是支持行级锁

行级锁&表级锁

什么是行级锁?什么是表级锁?学过程序的同学一定都对锁的概念有一定了解,顾名思义一个是锁住一行,一个是锁住一整张表,具体来看下面的例子:

典型案例

现有表T_A结构和数据如下

Mysql性能优化实战:数据库锁的介绍与索引查找原理

Mysql性能优化实战:数据库锁的介绍与索引查找原理

开启一个事务(session_1)并执行如下语句

Mysql性能优化实战:数据库锁的介绍与索引查找原理

事务一

在session_1不提交的情况下,开启新事务(session_2)并执行语句

Mysql性能优化实战:数据库锁的介绍与索引查找原理

事务二

结果出现事务超时,问题来了,报错是出现锁超时说明使用了表级锁,可是不是说InnoDB是行级锁吗?这里需要注意行级锁必须使用了索引后才会生效

Mysql性能优化实战:数据库锁的介绍与索引查找原理

我们通过给字段column_2添加索引后,再次执行如上的操作发现两个事务互不干扰执行成功,在高并发的场景下可以极大的提高程序运行效率。

死锁

死锁的产生主要是由于不同事务之间相互竞争同一个资源导致的。

Mysql性能优化实战:数据库锁的介绍与索引查找原理

具体案例

同样是上述的T_A表进行行的更新操作,在竞争资源时候引发了死锁

Mysql性能优化实战:数据库锁的介绍与索引查找原理

Mysql性能优化实战:数据库锁的介绍与索引查找原理

可以看出死锁在发生后会立刻报错。这里有个误区,在我们开发中常会遇到并发过高导致数据库中产生大量的锁无法及时释放常被开发人员说成是死锁,其实并不是,真正的死锁在产生的瞬间就会报错了。

索引的查询原理

上篇文章中我对索引的使用做了简单的介绍,一些同学可能对主键和索引这两个概念的区分并不是很清楚,下面我简单介绍下数据库中通过主键和索引查找记录的方式:

Mysql性能优化实战:数据库锁的介绍与索引查找原理

主键存储结构

Mysql性能优化实战:数据库锁的介绍与索引查找原理

索引存储结构

上图分别为主键和索引的存储结构,可以看到通过主键查找可以直接找到对应的记录,通过索引查找则是要先找到对应记录的主键,再根据主键查找对应记录。

通过上图分析可以得出两个结论:

1、必须要设置主键,因为索引最终还是要通过主键定位具体的记录

2、主键最好采用数值型,这样主键的存储分布更为均匀查找效率更高

转载地址:http://syzws.baihongyu.com/

你可能感兴趣的文章
python笔记04_多进程
查看>>
python笔记05_多线程
查看>>
python笔记06_进程vs线程
查看>>
设计模式17_命令模式
查看>>
设计模式18_责任链
查看>>
CTA策略01_dualThrust
查看>>
CTA策略02_boll
查看>>
vnpy通过jqdatasdk初始化实时数据及历史数据下载
查看>>
设计模式19_状态
查看>>
设计模式20_观察者
查看>>
vnpy学习10_常见坑
查看>>
vnpy学习10_常见坑02
查看>>
用时三个月,终于把所有的Python库全部整理了!拿去别客气!
查看>>
pd.stats.ols.MovingOLS以及替代
查看>>
vnpy学习11_增加测试评估指标
查看>>
资金流入流出计算方法
查看>>
股票资金净流入和净流出
查看>>
海龟交易法则06_掌握优势
查看>>
海龟交易法则07_如何衡量风险
查看>>
海龟交易法则08_风险与资金管理
查看>>