行级锁&表级锁

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

典型案例

现有表T_A结构和数据如下

数据库索引 怎样算索引加多了_mysql

数据库索引 怎样算索引加多了_数据库索引 怎样算索引加多了_02

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

数据库索引 怎样算索引加多了_索引_03

事务一

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

数据库索引 怎样算索引加多了_mysql_04

事务二

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

数据库索引 怎样算索引加多了_mysql_05

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

死锁

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

数据库索引 怎样算索引加多了_数据库_06

具体案例

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

数据库索引 怎样算索引加多了_数据库_07

数据库索引 怎样算索引加多了_数据库索引 怎样算索引加多了_08

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

索引的查询原理

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

数据库索引 怎样算索引加多了_数据库_09

主键存储结构

数据库索引 怎样算索引加多了_数据库_10

索引存储结构

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

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

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

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