MVCC:多版本并发控制,多版本指的是不同的快照。分为快照读和当前读。
RC级别下,MVCC会每个都获取最新的版本快照。
MVCC读取的版本和可见性有关,可见性和事务的隔离级别有关。
RR模式默认加间隙锁和排他锁。
幻读是一个事务的两次当前读。
快照读的:https://blog.csdn.net/jack1liu/article/details/106931988
--------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
事务:事务的流程
update t set b=10 where a=5;
第一步:根据where=5去数据库加载行数据,同时加上排他锁。
第二步:记录undo_log回滚和多版本的MVCC。将修改之前的版本写入到undo_log。
每一条记录都有一个指针执行undo_log记录的是数据。
第三步:新行更新到内存,再将修改语句记录到redo_log中,修改记录具体指的如何修改磁盘的记录页。写redo成功就是事务提交成功了。
为什么不直接写磁盘呢?
1.redo很快记录的是sql
2.redo是顺序io,写磁盘是随机io
第四步:写binlog日志。是逻辑日志。
第五步:commit
回滚指针其实就是指向undolog日志。
----------------------------------------------------------------------------------------------
什么时候需要创建索引:
B+tree:https://blog.csdn.net/hao65103940/article/details/89032538
建议建索引都是组合索引:
覆盖索引:就是不回表。
加索引的话尽量加组合索引会比较好。
---------------------------------------------------------------------------
下半部分
------------------------------------------------------------------------------------------------
这个在老的讲义上面
哪些情况需要创建索引
\1. 主键自动建立唯一索引
\2. 频繁作为查询条件的字段应该创建索引
\3. 多表关联查询中,关联字段应该创建索引
\4. 查询中排序的字段,应该创建索引
\5. 查询中统计或者分组字段,应该创建索引
哪些情况不需要创建索引?
\1. 表记录太少
\2. 经常进行增删改操作的表
\3. 频繁更新的字段
\4. where条件里使用频率不高的字段
索引的失效分析?
4.第四个的意思就是如果有age>23 and pos='manager'的话只能走age的索引走不了pos的索引。
如何解决索引的失效的问题:
使用覆盖索引。
使用or的话走全表扫描。
---
举例:
------------------------------------------------------------------------------------------------------------------------------------------------------
一致性非锁定读取:
一行sql记录了什么?
---------------------------------------------------------------------------------------------
mysql的性能分析,这一部分以后再学习的话要自己实现下:
慢查询的功能:
1.找到是哪一条sql的问题,慢查询日志:docker连接数据库docker exec -it efbfc9086715 bash
查看慢查询:show variables like '%slow_query%';
show variables like '%long_query_time%';
10:37:53以后好好看看。
我们可以看下慢查询日志:
---------------------------------------------------------------------------------------------------------------------------------------------------------
2.性能分析查看执行计划:
看下哪些是重要的:
select_type不是特别重要的。
type重要。
这个是按照性能从高到低的顺序就行排行的。
type的种类:
system:表示只有一行或者是空表。
注意下这个sql,我先查的是orders表。返回的是一条记录。查出userid,再user也会返回一条记录。
-------------------
未完延申到下一节课。