Mysql索引与锁

Mysql索引与锁

本文以Mysql5.7为例测试。

1:mysql索引方法

Mysql的索引方法分为btree索引和hash索引。

hash索引:是通过hash计算后比较,所以只能用于等值过滤,不能用于范围过滤。Hash索引会根据列数据维护一张hash表,所以任何时候都要进行hash表扫描,当hash表数据量庞大时,性能急剧下降。

Sql语句

是否使用索引

select * from t1 where c1=1 and c2=2

select * from testindex where c2>'1' and c1

select * from t1 where c1=1

select * from t1 where c2=2

×

结论:如果需要使用c2过滤时使用索引,必须同时用c1过滤

CREATE TABLE `testnoindex` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`c1` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

Id为主键索引,c1为普通字段,初始化一些数据方便查看

Session1:设置不自动提交,并执行update语句,根据条件可以看出,更新的是id为10的记录,执行完如果没有显式调用commit,则会锁整个表。

SET AUTOCOMMIT=0;

update testnoindex set c1='2017-08-0209:52:21' where c1='2017-08-02 10:47:20';

注意:c1一定是无索引情况,如果有索引(非唯一索引),都不会锁整张表。

session2:更新id为1的记录,获取锁超时。

以上实例可以证明mysql innodb存储引擎默认是表级锁,当然innodb是支持行级锁的,比如通过唯一主键就可实现行级锁。

如果where条件的索引数据是多行的话,多行数据会同时被锁定,可理解为范围锁。

Mysql有三种锁Record,Gap, and Next-KeyLocks。Recode为行锁,Gap为间隙锁,Next-KeyLocks为前两种的结合。我们先看一个实例,加入mysql中记录为如下所示:

Session1:执行下面语句,因为没有7的记录,会向左扫描至id=2的记录,向右扫描至id=8的记录,锁定区间为(2,8)。

set autocommit=0;

update testnoindex set c1='2017-08-0210:47:09' where id=7;

session2:执行如下语句,可以看出id=4的记录被锁定。

INSERT into testnoindex (id,c1)values(16,NOW());

INSERT into testnoindex (id,c1)values(4,NOW());

[SQL]INSERT into testnoindex (id,c1)values(16,NOW());

受影响的行: 1

时间: 0.087s

[SQL]

INSERT into testnoindex (id,c1)values(4,NOW());

[Err] 1205 - Lock wait timeout exceeded;try restarting transaction

4:共享锁与排他锁

Mysql行级锁又分为共享锁(读锁或S锁)和排他锁(写锁或X锁),比如forupdate就是排它锁。Mysql默认delete,insert,update都是排它锁,select默认无锁。

²  如果行记录被加了排它锁,则其他事务无法再在其上加锁,也就是加锁状态无法读取/修改。换句话说就是如果被加了排他锁的行,不能再加排他或共享锁,但是可以无锁读取(普通select,)。

²  如果行记录被加了共享锁,则其他事务只能在共享锁或无锁状态下读取。

Mysql索引与锁相关教程

mysql suoyin 和锁_Mysql索引与锁相关推荐

  1. mysql suoyin 和锁_mysql 索引和锁

    mysql的查询流程一般是:mysql客户端通过协议与mysql服务器建立连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析,有一系列预处理,比如检查语句是否写正确了,然后是 ...

  2. mysql b 树 锁_mysql索引B+树、MVCC、锁一文搞懂

    1.innodb索引 innodb是页存储,一页是16K. 一个表的行数据都放到页里,单页都是单链表递增排序. 每个页之间都是双向链表保存.该页标记成数据页. 根据id查询时,也不知道在哪个数据页上. ...

  3. mysql 表级锁_MySQL行级锁和表级锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  4. mysql表级锁和行级锁_MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  5. mysql a锁_MYSQL中的锁

    前言 刚开始接触MYSQL,对其锁机制并不了解,在项目里面,针对死锁以及锁竞争,约定了两条规则. 对涉及多个业务表的更新,要遵守一定的顺序,如按照TABLE-A,TABLE-B,TABLE-C的次序 ...

  6. MySQL并发 共享锁目的_mysql并发与锁机制

    在InnoDB中,锁是逐步获得的,因此发生死锁是可能的.发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另外一个事务获得锁,并继续完成事务.但在涉及外部锁,或涉及表锁的情况下,I ...

  7. mysql默认乐观锁悲观锁_MySQL中悲观锁和乐观锁到底是什么?-阿里云开发者社区...

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁. 行锁就是按 ...

  8. mysql中的乐观锁_MySQL中悲观锁和乐观锁到底是什么?

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁.行锁就是按照 ...

  9. mysql innodb 间隙锁_Mysql innodb 间隙锁

    前段时间系统老是出现insert死锁,很是纠结.经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围.间隙锁的主要作用是为了防止出现 ...

最新文章

  1. oracle数据类型之number/char浅析
  2. java 编译器获得型号_关于编译器构造:如何找到已编译类的目标Java版本?
  3. 机器人学中的一些概念3——雅克比矩阵
  4. Linux调度系统全景指南(终结篇)
  5. 扩展 junit 框架_JUnit 5扩展模型的生命周期
  6. python怎么运行matlab代码_用python运行matlab代码
  7. 软工作业:(2)硬币游戏--代码分析与改进
  8. red hat 5.5 vncserver搭建
  9. Ubuntu安装sqllite3并使用
  10. pytorch冻结模型
  11. anaconda下jupyter无法自动打开网页
  12. poj1265 -- Area(皮克定理)
  13. A-PDF All to MP3 Converter 2.0.0 (.wav) Buffer Overflow Exploit 分析
  14. PHP连接SQL SERVER 数据库 PHP连接MYSQL数据库并解决中文乱码问题。
  15. 桌面天气秀 3.6 正式版
  16. linux 跨平台查询 lxr,利用LXR来生成Linux内核代码的交叉索引页面
  17. Java txt文件 转 utf-8 格式
  18. WIN10共享打印机报错解决方法
  19. h5唤起app,清除timeout
  20. 商会管理系统_沈阳写字间丨商会总部大厦

热门文章

  1. HTML与CSS基础之伪元素(五)
  2. java复用类_java复用类
  3. mysql dba管理_Mysql DBA 高级运维学习之路-mysql数据库常用管理应用
  4. ubuntu16下vue-cli安装
  5. PHP中单引号和双引号到底有啥区别
  6. mathematica练习程序(图像取反)
  7. eclipse配置代码提示
  8. 美国和中国将成数据中心建设首选之地
  9. 安装漂亮的Faenza1.3与Faience0.5图标主题
  10. Python - 利用pip管理包