![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据库
阿猫阿狗学编程
这个作者很懒,什么都没留下…
展开
-
3张图搞懂mysql事务隔离级别以及MVCC
首先先理清事务,事务隔离级别,事务传播的概念。事务:一组sql要么都失败,要么都成功。事务隔离级别:事务与事务之间的可见性。有读未提交,读到别人尚未提交的数据。读已提交只能读取别人已提交的事务。可重复读,只能读取别人已提交的事务,并且这个已提交的事务,它开启的时间要小于当前事务开始的时间。序列化,只能有一个事务在运行。事务传播:如果有事务了,后面创建事务的行为。比如可以加入前面事务,或者新建,或者直接异常等等。MVCC:中文名叫多版本并发控制是在可重复读的事务级别上,mysql为了提高并发性而使用的原创 2021-04-24 12:43:38 · 105 阅读 · 0 评论 -
数据库为什么推荐小表驱动大表
小表驱动大表,跟大表驱动小表有区别吗?不都是n*m级别吗?我们来看个例子。小表A 有id 1,2,3,4,5。大表B 有id 1~100.小表驱动大表拿到A表的id去B表关联,匹配5次就结束了。大表驱动小表 ,6~100这些id其实都是匹配不到的,但还是会跟A表匹配。匹配了100次。伪码:小表A Set idA;大表B Set idB;小表驱动大表://遍历A表的idfor ( ida: idA ){//循环5次就ok了//如果可以匹配到,索引是B+树匹配很快的return原创 2021-01-16 14:04:16 · 1924 阅读 · 0 评论 -
一张图看懂mysql执行流程
这是update执行流程这是select执行流程原创 2020-11-18 23:06:36 · 227 阅读 · 0 评论 -
压在redis身上的三座大山
三座大山分别是缓存穿透,缓存击穿,缓存雪崩缓存穿透:查询参数是无效的key,这个key在redis没有,然后取数据库查也查不到,导致无用查询。解决方法有两个 1是value设置成null。2是使用布隆过滤器,布隆过滤器可以看出一个数组,然后我们对key进行多次不同hash运算,然后对长度取模,对应位置标记成1,下次有key来的时候先判断这个布隆过滤器对应的下标是不是都是1,如果不是就是没有的key。缓存击穿:热点key失效了,然后突然有很高的并发来查询这个key,导致很多查询跑到数据库去。解决方法是 对原创 2020-08-23 17:51:26 · 148 阅读 · 0 评论 -
mysql查询慢排查
查询慢分两种一种是偶尔性慢,一种是总是慢。针对总是慢主要是加索引,可以解决90%的问题,然后是优化sql,而且需要注意的是,加了索引还要让索引生效,比如没有遵守最左前缀原则,或者对列进行函数操作。还有一种是mysql在查询的时候认为走索引性能更差,也就是误判了,需要我们在sql上强制走索引select * from t force index(column).偶尔慢:可能的原因是数据库并发高,其他线程锁行或者锁表。 或者是redolog满了,需要刷新到磁盘,这种可以通过flush相关参数进行优化。原创 2020-08-23 17:12:24 · 229 阅读 · 0 评论 -
萌新也能看得懂之mysql索引底层原理
索引是什么?索引就是一种数据结构,目的是为了加快查询速度。既然是为了加快查找的数据结构,那就有以下几种选择。1.hash索引。2.树。选择hash索引:hash索引虽然查找是o(1)级别的,但是不能进行范围查询。比如要查找年龄20~30的,只能进行全表扫描,也就是对于范围查找索引失效,会进行全表扫描。选择树结构:查找算法如果是有序的就可以选择二分法查找,为了使用二分法的数据结构有树。树的选择方案很多,有二叉树,b树,红黑树等。mysql默认使用的是B+树。二叉树,红黑树有一个缺点就是数据量大的时候原创 2020-08-09 14:46:26 · 83 阅读 · 0 评论 -
萌新也能看得懂之mysql事务实现原理
undo文件:在操作更新到磁盘前把旧值先写到undo日志中。undo作用用于回滚。A旧值200,B旧值100,开启的事务是T1,圆圈数字开头的是undo日志内容开启事务①T1,开始②T1,A,200执行A=A-50③T1,B,100执行B=B+50把A写入磁盘把B写入磁盘④T1,提交如果在执行把B写入磁盘的时候断电(或者回滚),读取undo日志发现没有“T1,提交”执行A=200,B=100,这样就能回到以前的状态了。redo文件:把新的值记录在redo日志中redo作用用于原创 2020-08-07 00:06:57 · 84 阅读 · 0 评论 -
4张图片理解MYSQL事务隔离级别以及MVCC机制
1.数据库锁的粒度。比如数据有个money列,int money=100;//数据库当前值线程A:money=money+20;//有人转账20元在线程A还没从内存刷到磁盘的时候,线程B来了线程B:money=money-20;//转出20元线程B:刷到磁盘Money=80;线程A:刷到磁盘money=120;正确是100元,数据出现问题了。所以需要加锁,跟java加锁sychronized效果差不多,同时只有一个线程进行操作,我们是对一行数据加锁所以叫行级锁。如果对整张表加锁就叫表锁,如果原创 2020-08-06 21:35:51 · 126 阅读 · 0 评论 -
一张图搞懂数据库四种表的连接
左连接表示显示A表所有的行,当某一行在B表中没有对应关系时,该行在B表的属性显示null。其他三种连接同样的道理。原创 2018-11-25 23:28:15 · 1453 阅读 · 0 评论