开课吧mysql-------------------05

MVCC:多版本并发控制,多版本指的是不同的快照。分为快照读和当前读。
RC级别下,MVCC会每个都获取最新的版本快照。

MVCC读取的版本和可见性有关,可见性和事务的ID有关。

RR模式默认加间隙锁和排他锁。

幻读是一个事务的两次当前读。

-----------------------------

事务:事务的流程

update t set b=10 where a=5;

第一步:根据where=5去数据库加载行数据,同时加上排他锁。

第二步:记录undo_log回滚和多版本的MVCC。将修改之前的版本写入到undo_log。

每一条记录都有一个指针执行undo_log。

第三步:再将修改语句记录到redo_log中,修改记录具体指的如何修改磁盘的记录页。写redo成功就是事务提交成功了。

为什么不直接写磁盘呢?

1.redo很快

2.redo是顺序io,写磁盘是随机io

第四步:commit

第五步:写binlog日志。是逻辑日志。

----------------------------------------------------------------------------------------------

建议建索引都是组合索引:

覆盖索引:就是不回表。

加索引的话尽量加组合索引会比较好。

-----------------------------------------------------------------------------------------------

下半部分

------------------------------------------------------------------------------------------------

哪些情况需要创建索引
\1. 主键自动建立唯一索引
\2. 频繁作为查询条件的字段应该创建索引
\3. 多表关联查询中,关联字段应该创建索引
\4. 查询中排序的字段,应该创建索引
\5. 查询中统计或者分组字段,应该创建索引

哪些情况不需要创建索引?

\1. 表记录太少
\2. 经常进行增删改操作的表
\3. 频繁更新的字段
\4. where条件里使用频率不高的字段

索引的失效分析?

4.第四个的意思就是如果有age>23 and pos='manager'的话只能走age的索引走不了pos的索引。

如何解决索引的失效的问题:

使用覆盖索引。

使用or的话走全表扫描。

--------------------------------

mysql的性能分析,这一部分以后再学习的话要自己实现下:

1.找到是哪一条sql的问题,慢查询日志:docker连接数据库docker exec -it efbfc9086715 bash

                       查看慢查询:show variables like '%slow_query%';

                                           show variables like '%long_query_time%';

                        开启:看下笔记。我们是docker部署的,就是临时开启就可以。

10:37:53以后好好看看。

我们可以看下慢查询日志:

----------------------------------------------------------

2.性能分析查看执行计划:

看下哪些是重要的:

select_type不是特别重要的。

type重要。

这个是按照性能从高到低的顺序就行排行的。

注意下这个sql,我先查的是orders表。返回的是一条记录。查出userid,再user也会返回一条记录。

-------------------

未完延申到下一节课。

发布了322 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28764557/article/details/104488022