mysql suoyin 和锁_Mysql索引与锁
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索引与锁相关推荐
- mysql suoyin 和锁_mysql 索引和锁
mysql的查询流程一般是:mysql客户端通过协议与mysql服务器建立连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析,有一系列预处理,比如检查语句是否写正确了,然后是 ...
- mysql b 树 锁_mysql索引B+树、MVCC、锁一文搞懂
1.innodb索引 innodb是页存储,一页是16K. 一个表的行数据都放到页里,单页都是单链表递增排序. 每个页之间都是双向链表保存.该页标记成数据页. 根据id查询时,也不知道在哪个数据页上. ...
- mysql 表级锁_MySQL行级锁和表级锁
锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...
- mysql表级锁和行级锁_MySQL表级锁和行级锁
一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- mysql a锁_MYSQL中的锁
前言 刚开始接触MYSQL,对其锁机制并不了解,在项目里面,针对死锁以及锁竞争,约定了两条规则. 对涉及多个业务表的更新,要遵守一定的顺序,如按照TABLE-A,TABLE-B,TABLE-C的次序 ...
- MySQL并发 共享锁目的_mysql并发与锁机制
在InnoDB中,锁是逐步获得的,因此发生死锁是可能的.发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另外一个事务获得锁,并继续完成事务.但在涉及外部锁,或涉及表锁的情况下,I ...
- mysql默认乐观锁悲观锁_MySQL中悲观锁和乐观锁到底是什么?-阿里云开发者社区...
索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁. 行锁就是按 ...
- mysql中的乐观锁_MySQL中悲观锁和乐观锁到底是什么?
索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁.行锁就是按照 ...
- mysql innodb 间隙锁_Mysql innodb 间隙锁
前段时间系统老是出现insert死锁,很是纠结.经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围.间隙锁的主要作用是为了防止出现 ...
最新文章
- oracle数据类型之number/char浅析
- java 编译器获得型号_关于编译器构造:如何找到已编译类的目标Java版本?
- 机器人学中的一些概念3——雅克比矩阵
- Linux调度系统全景指南(终结篇)
- 扩展 junit 框架_JUnit 5扩展模型的生命周期
- python怎么运行matlab代码_用python运行matlab代码
- 软工作业:(2)硬币游戏--代码分析与改进
- red hat 5.5 vncserver搭建
- Ubuntu安装sqllite3并使用
- pytorch冻结模型
- anaconda下jupyter无法自动打开网页
- poj1265 -- Area(皮克定理)
- A-PDF All to MP3 Converter 2.0.0 (.wav) Buffer Overflow Exploit 分析
- PHP连接SQL SERVER 数据库 PHP连接MYSQL数据库并解决中文乱码问题。
- 桌面天气秀 3.6 正式版
- linux 跨平台查询 lxr,利用LXR来生成Linux内核代码的交叉索引页面
- Java txt文件 转 utf-8 格式
- WIN10共享打印机报错解决方法
- h5唤起app,清除timeout
- 商会管理系统_沈阳写字间丨商会总部大厦