MySQL--锁与事务以及索引相关

本文深入探讨了数据库的并发控制机制,包括读锁、写锁、锁粒度、事务特性和隔离级别。详细解析了MVCC如何提升并发性能,以及索引的类型和优化策略,为数据库性能调优提供了实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考于《高性能MySQL》第一章

1、读锁、写锁

在多用户访问数据时,可能会造成同时对数据进行操作的情况,此时可能会导致数据的修改没有达到预期的效果,因此解决方法就是并发控制

在处理并发读或写时,通过两种锁来达到并发控制,共享锁(读锁)、排它锁(写锁)

读锁是共享的,相互之间不阻塞的,即多个用户在同一时刻可以同时读取同一个资源。读锁可以和读锁并存

写锁是排它的,即一个写锁会阻塞其它的写锁,读锁。写锁和写锁、写锁和读锁都是不并存的。

2、锁粒度

表锁(table lock):最常见的加锁方式,它会锁住整张表。在MySQL中,默认写操作时对表加写锁,此时其它用户无法对该表做任何操作;在读操作时,默认加读锁,可以让多个用户读操作。牢记:写锁的优先级高于读锁

行级锁(row lock):可以最大程度地支持并发处理(同时也带来了最大的锁开销),但是行级锁只在存储引擎层实现,例如InnoDB中。

3、事务的理解

事务是数据库中的执行单元,事务中一般包含多条sql语句,这些语句要不全部执行成功,要不一个也不成功,也可以说,只有最后一个sql语句执行完并且提交该事务,才能说事务执行成功。

事务满足四个特性,ACID

原子性(Atomicity):事务被视为不可分割的最小工作单元,要么全部成功,要么全部失败;

一致性(Consistency):数据库总是从一个一致的状态转换到另一个一致的状态;

隔离性(Isolation):事务之间是不可见的;

持久性(Durability):一旦事务提交,则其所做的修改会永久的保存到数据库中,这个特性有点模糊,因为持久性有很多的级别。并且数据库中的数据需要备份,这就是矛盾。

4、隔离级别

read uncommitted(未提交读):事务中的修改,即使未提交,在其它事务中也是可以读到的。此时会造成脏读,例如一个事务修改但最后没有提交,其它事务读到修改之后的数据但未被提交的

read committed(提交读):在一个事务对数据进行修改时,其它事务只能读到未修改的数据,就是说,事务之间不可见。此时可能会造成读到数据后再次读取会读到不一样的数据

repeatable read(可重复读):一个事务不能读取另一个事务正在操作的数据,会被阻塞。此时会造成幻读,即当某个事务读取某个范围内的数据时,另一个事务在该范围插入了新的数据,当之前的那个事务再次读取时,会产生幻行。

serializable(可串行化):最高的隔离级别,解决了幻读的问题。在读取数据时,会在读取的每一行加锁,保证了数据的安全性,但造成了读取时间长和争锁的问题。

针对以上隔离级别read committed(提交读)、repeatable read(可重复读)的问题,出现了MVCC(Multiversion Concurrency Control,多版本并发控制),是通过利用时间点的快照实现的,并且对增删改查的加锁机制不一样,这里不研究,详情请参阅《高性能MySQL》。

5、MVCC的简单理解

可以认为MVCC是行级锁的一个变种,但是MVCC在很多情况下都避免了加锁操作,实现了非阻塞的读操作,写操作只是锁住必要的行

MVCC是通过保存数据在某个时间点的快照实现的,并且只在read committed(提交读)、repeatable read(可重复读)两个级别下使用。

6、索引

数据库中的索引是某个表中一个列或多个列的集合,它的作用是快速的定位到想要查询的部分。在MySQL中,存储引擎使用索引可以快速找到对应的数据行。

7、索引的类型(索引的数据结构

大部分都是使用的B-Tree索引,使用B-Tree索引结果来存储数据,B-Tree的存储特性是按顺序存储,因此查询速度快。不同的存储引擎以不同的方式使用B-Tree,例如MyISAM使用前缀压缩技术使得索引更小,而InnoDB按照原数据格式进行存储。

哈希索引,基于哈希表实现,对于每一列的数据,都会根据索引列计算哈希值进行存储,在MySQL中,只有Memory引擎显示支持哈希索引。

其它的还有空间索引、全文索引(根据文本中的关键词)

8、索引的优点

1)减少了查询的数据量;

2)帮助服务器避免排序和临时表,例如B-Tree中的数据存储已达到有序;

3)可以将随机IO成为顺序IO。

请记住,索引并不是最好的解决方案,只有在利用索引得到好处大于其带来的额外工作时,索引才是有效的。

9、索引优化

1)独立的列:在使用索引进行查询时,索引不能是表达式的一部分,也不能是函数的一部分;

2)选择合适的索引列顺序:有一个经验法则:将选择性最高的列放到索引列前面;

3)聚簇索引:一种数据存储方式,例如在InnoDB中在同一结构保存了B-Tree索引和数据行,记住一张表只能有一个聚簇索引,而且不是所有的存储引擎都是支持聚簇索引的;

4)未使用的索引:有一些索引永远不用,建议将其删除。

10、简单了解存储引擎

1InnoDB存储引擎

数据存储在表空间(InnoDB管理的一个黑盒子);

采用MVCC支持高并发,并且实现了四个隔离级别;

InnoDB中表基于聚簇索引建立的;

2MyISAM存储引擎:

5.1及之前版本中默认的存储引擎,支持全文检索、压缩等,但不支持事务和行级锁;

将表存储在两个文件中:数据文件和索引文件;

MyISAM是对整张表加锁的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值