MySQL索引与锁笔记

摘要:
使用临时密钥锁的一个优点是,假设我们执行查询select*fromtablename,其中id=1;如果ID是唯一的索引,则临时密钥锁将降级为记录锁,以锁定此记录而不是范围。一般的处理方法是用最少的行级锁回滚事务。
一.索引

索引主要是为了提高查询速度,能够提高查询速度的原因是将无序的数据变成有序(相对)

索引分聚集索引,非聚集索引
B+树索引,Hash索引


聚集索引:一般主键索引就是聚集索引,聚集索引的叶子节点存储表中的数据
非聚集索引:又称二级索引,非主键索引都称为非聚集索引,非聚集索引的叶子节点存储的是主键(为什么存储的主键,而不是记录所在地址呢,理由相当简单,因为记录所在地址并不能保证一定不会变,但主键可以保证。)
通过非聚集索引查找数据时,要先去找叶子节点的主键,再通过主键去查找所要的数据,这个过程叫做回表
这就引出了另一种索引
覆盖索引:从索引中直接查找结果,即要查询的字段和索引是对应的,避免了回表


B+树索引:一种平衡树,从根节点到叶子节点一层一层的查找数据,InnoDB默认就是B+树索引
Hash索引:对索引键值做hash运算,然后通过hash值查找所需的数据,很适合等值查询
重复值比较多的话,就不适合用Hash索引了


二.锁

数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则。下图来源于http://database.51cto.com/art/201810/585002.htm

MySQL索引与锁笔记第1张

使用方式来分类:悲观锁和乐观锁

悲观锁是在使用数据之前,加行锁(使用 select * from tablename where id=2 for update手动加锁)
乐观锁是一种逻辑或者说一种思想,它不是数据库层面上的锁,要手动添加,一般额外加一个version字段

锁的粒度分类:表级锁,行级锁,页级锁

用的比较多的是表级锁和行级锁

表级锁:开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

MySIAM只支持表级锁,
InnoDB支持表级锁和行级锁
行锁跟索引有关,如果某行上没有索引,则会自动变为表锁


锁的类型分类:共享锁,排他锁,意向共享锁,意向排它锁

共享锁,排它锁按照锁的粒度都是行级锁

意向共享锁,意向排它锁 都是表级锁,主要是用来标记一个事务对于这张表操作的一个意向

共享锁:一般是查询的时候加共享锁,其他事务可以读,但是不能更改
排他锁:一般是修改操作时,加排他锁
意向共享锁:一个事务对某张表的一行加共享锁之前,必须加一个意向共享锁或者更强的锁
意向排他锁:一个事务对某张表的一行加排他锁之前,必须加一个意向排他锁

其他的锁还有间隙锁,记录锁,临键锁

间隙锁:锁住的是一个索引的范围,启用它有一个前置条件,就是数据库隔离级别必须是Repeatable Read(可重复读),这也是InnoDB的默认隔离级别,假设我们将隔离级别降到Read Committed(读提交),间隙锁将会自动失效。

间隙锁的使用,能够有效的防止幻读。

记录锁:锁住一条记录,这是Read Committed(读提交)事务级别的默认锁级别。记录锁是作用于索引的,所以,当查询不是作用于索引上时,系统会创建一个隐式的聚集索引,然后作用在索引上。
共享记录锁:select * from tablename where id=1 lock in share mode
排他记录锁:select * from tablename where id=1 for update

临键锁:临键锁就是记录锁+间隙锁的组合方式。这是Repeatable Read(可重复读)隔离级别的默认锁级别。使用临键锁有一个好处,就是,假设我们执行一个查询
select * from tablename where id = 1;
如果id是唯一索引,那么临键锁就会降级为记录锁,锁住这条记录,而不是去锁住一个范围。

这里引出两个概念:

锁等待:由于资源不足引起的排队等待现象

死锁:两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。

一般的处理方式是将持有最少行级锁的事务进行回滚。

免责声明:文章转载自《MySQL索引与锁笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java java httpclient4.5 进行http,https通过SSL安全验证跳过,封装接口请求 get,post(formdata,json)封装,文件上传下载WPF下的语法高亮控件——AvalonEdit下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复

centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复 有时候我们会碰到这样的业务场景: 1.将大的数据库恢复到本地进行业务测试 2.数据库性能碰到了瓶颈需要做基于主从复制的读写分离 这样我们就需要对源数据库进行备份,并恢复到目标服务器中 如果源数据库全部是myisam数据库那我们可以...

mysql导入备份.sql文件时报错总结(还有待完善)

错误1:ERROR Unknown character set: 'utf8mb4'   utf8mb4编码集支持了表情符号,相信处理过社交网络数据的人都有了解。这个mysql5.5以后支持了utf8mb4编码集,所以只能卸载5.1,升级5.5   在mysql my.cnf设置default-character-set = utf8mb4,在每个[]里都...

根据javabean转换为mysql建表语句与mapper内容

一般上,我们会使用数据库表转换为javabean、dao、或是mapper,就叫逆向工程。做项目时一般也是先设计数据库,再进行系统开发,所以一般使用逆向工程。 但我这边由于工作临时的需要,需要将javabean转换为建表语句和Mybatis的Mapper文件,于是上网搜了一下,大部分是做一个工具类进行bean解析输出的。 根据自身项目命名设计要求,将jav...

详谈 oracle 索引 (笔记)

1、oracle索引空值问题   当在有空值得列上建立单列索引时,如果搜索条件为 is null 在解释计划中可以看到,对于此列oracle并没有使用索引查询;   但是当建立的是多列索引是,就会按照索引来进行查询。 2、B-树索引   示意图:    在B-树索引中,将会按照从上到下的顺序进行索引。如果列的选择度不低的话,索引扫描就会很慢。原因就在于要遍...

【mysql】 数据库字符集和排序规则

库的字符集影响表和字段的字符集 数据库字符集 》表的字符集 》 字段的字符集 (从前往后优先级由低到高,从左往右继承,如果表没设置字符集,继承数据库的,如果字段没设置,继承表的) 数据库的字符集如果是utf8,表和字段的字符集继承 字段的字符集和排序规则继承自表,例如表的字符集为latin1,那表的字段(字符型)都是latin1 修改表的字符集对新增加字...

mysql主从之半同步复制和lossless无损复制

一 MySQL 的三种复制方式 1.1 简介 asynchronous 异步复制 fully synchronous 全同步复制 Semisynchronous 半同步复制 从MySQL5.5 开始,MySQL 以插件的形式支持半同步复制。 1.2 异步复制(Asynchronous replication) MySQL 默认的复制是异步的,主库在执...