MySQL
2020-08-05 14:06:23 10 举报
mysql
作者其他创作
大纲/内容
事务2
age
DB_ROLL_PTR
尽量使用连接代替子查询,使用子查询,mysql会在neicun中创建临时表
服务器进行sql解析预处理,优化器再生成执行计划
避免对索引字段进行函数操作,索引字段上也不要使用is null或is not null
insert undo log:事务在插入新纪录的时候生成
1,undo log中会保存一个记录数据版本的单链表,链表头结点是最新加入的旧记录
tom
可以读取当前最新数据
客户端发送一条查询语句给服务器
快照读:不加锁的select,读到的不一定是数据的最新版本
加锁
服务器检查是否命中缓存
,事务已提交,当前事务能够查看到最新数据
1
一直慢
Jerry
DB_TRX_ID
true
内存不足
可见性算法判断当前事务可以看到哪个版本的数据
悲观锁:每次从数据库中取数据的时候总认为有其他线程会修改这条数据。所以每次拿数据都会对这条数据上锁
建索引没走上
尽量使用主键查询,避免回表操作
当前事务修改的数据不可读
Read view
selsect为什么慢
没走指定索引
name
1,将被修改数据的最新记录中的DB_TRX_ID取出
DB_ROW_ID
28
在多个事务并发访问数据库时,如何解决线程不安全问题?
小表驱动大表,用小的数据集驱动大的数据集
undo log
回滚时需要
可以尝试force index走强制索引
维护一个数据记录的多个版本,使得并发环境下的读写操作不冲突
排它锁
避免select*,只查找需要的字段
当前系统中所有未提交的事务id
mysql更新和插入一条数据,会先把这条数据写到redo log中,等mysql空闲的时候再把redo log中的数据持久化到磁盘上
是不是对索引字段做了函数或者逻辑运算操作导致索引失效
DB_ROW_ID:隐藏的自增id
操作的表或者字段上有锁
mysql根据执行计划,调用存储引擎层的API来执行查询
乐观锁:总是认为不会产生并发问题,每次从数据库中取数据的时候总是认为不会有其他线程修改这条数据,但是在更新数据前确认有没有其他线程修改过这条数据。
事务已提交当前事务能够查看最新数据
sql优化
false
undo日志
null
但是redo log容量是有限的,当更新比较频繁,redo log会很快写满,mysql会停下其他工作来做持久化
24
up_limit_id<DB_TRX_ID<low_limit_id
共享锁
与共享锁比,阻塞了加共享锁的查询
sql语句的执行过程
ox4656124
sql后加LOCK IN SHARE MODE,其他线程可以读取这些数据记录,也可以继续添加共享锁,但是无法修改
偶尔很慢
直接把缓存中的数据返回给客户端
不加锁
Read view执行快照读时产生的视图
最小事务idup_limit_id
通过explain分析是不是数据库选错索引还是走的全表扫描
Mysql表
DB_TRX_ID>low_limit_id
2
无法读取最新的数据。需要通过回滚指针去undo log日志中遍历链表中的每一个事务id
可见性算法流程
悲观锁 & 乐观锁
优化
当前数据在read view后生成,当前事务不可见
最新数据是否可见?
jerry
判断DB_TRX_ID是否在read view列表中
1,事务1对该行数据做修改时,会对该数据记录加一个排它锁2,将这条数据记录拷贝到undo log中3,修改指定的字段值,修改隐藏的事务id为事务1的id,以后依次递增,回滚指针指向undo log中的拷贝副本
慢查询sql
Read view的生成时机不同,造成读已提交和可重复读的快照读结果不同--------------------------------------------------------------------------1,在可重复读的隔离级别下,多次快照读使用的是第一次快照读生成的read view。当前事务在其他事务提交数据之前使用过快照读,之后的快照读都会使用同一个read view2,在读已提交的情况下,每次快照都会生成一个Read view
ox12440546
update undo log:事务在更新,删除时生成
版本号(version)
当前读:使用共享锁或排它锁操作都是一种当前读。说白了就是加锁
innodb中为了提高数据库的并发性能,以一种不加锁的方式处理多个事务环境下的数据读写冲突。
DB_TRX_ID<up_limit_id
事务1
DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本
CAS
在数据表上加一个版本号字段,表示数据被修改的次数,某条数据被修改时,该记录对应的版本号加1。线程A要更新这条数据时会先查看对应的版本号,更新数据时会查看当前版本号和之前查出的版本号是否一致
考虑对where后面的字段建索引,如果是多个字段,考虑建立联合索引,写sql考虑使用覆盖索引和最左匹配原则
回滚和快照读时都需要
DB_TRX_ID:最后一次修改该记录的事务id
查询字段没有建索引
MVCC
redo log写满
最大事务id+1low_limit_id
MVCC实现原理
索引优化
0 条评论
下一页