innodb_lru_scan_depth
全部标签近日, 在一个小型项目中, 遇到了一个触及我知识盲区的bug. 项目用的是MySQL5.7.25, 其中有一张表 config_data,包含四个字段,id,name,value,expireAt.其中id为主键,name建有唯一索引,表的用途大概就是存放一些有时效性的配置.以上就是这次故事的背景.(不要问我为什么要用这么奇怪的方式处理需要过时的配置,项目太简陋以至只有一台虚拟主机和一个数据库,别的什么都没了,包括Redis) 这张表的使用场景大致为,假设需要使用某配置a,先尝试从表中查找a,若找到,判断是否过期,过期或者值不存在则从外部获取配置的值并存入表中,以便下次使用. 伪代码流程如下:
作者:郑啟龙摘要:对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是B+树结构,可以加速SQL查询。但对于B+树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从MYSQL行记录开始说起,层层递进,包括数据页,B+树聚簇索引,B+树二级索引,最后在文章末尾给出MYSQL索引的建议。文章涉及较多基础知识,内容较为枯燥,因此采用较多的图片补充说明,希望能对读者有帮助。A.一条记录存储格式:COMPACT行记录结构mysql是关系型数据库,每一行记录都是表结构定义的关系的显示表达。在脑中很直观地想到,记录存储时也可能按行存储。的确,m
作者:郑啟龙摘要:对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是B+树结构,可以加速SQL查询。但对于B+树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从MYSQL行记录开始说起,层层递进,包括数据页,B+树聚簇索引,B+树二级索引,最后在文章末尾给出MYSQL索引的建议。文章涉及较多基础知识,内容较为枯燥,因此采用较多的图片补充说明,希望能对读者有帮助。A.一条记录存储格式:COMPACT行记录结构mysql是关系型数据库,每一行记录都是表结构定义的关系的显示表达。在脑中很直观地想到,记录存储时也可能按行存储。的确,m
前言 最近复习操作系统,看到了lru算法,就去网上搜索下,因此发现了GeeCache,顺手写了一遍。研究下lru算法的实现。正文: lru使用map+链表实现。map里面存储了key以及其对应的链表节点。当我们根据某个key访问缓存值的时候,可以经过map快速定位到该链表节点。从而获取值下面我们来看下它的具体实现:首先,我们可以考虑下lru的结构: 1.map 2.链表 3.占用的内存大小 4.最大内存typeCachestruct{ maxBytesint64 nbytesint64 ll*list.List cachemap[string]*list.Element}添加key
前言 最近复习操作系统,看到了lru算法,就去网上搜索下,因此发现了GeeCache,顺手写了一遍。研究下lru算法的实现。正文: lru使用map+链表实现。map里面存储了key以及其对应的链表节点。当我们根据某个key访问缓存值的时候,可以经过map快速定位到该链表节点。从而获取值下面我们来看下它的具体实现:首先,我们可以考虑下lru的结构: 1.map 2.链表 3.占用的内存大小 4.最大内存typeCachestruct{ maxBytesint64 nbytesint64 ll*list.List cachemap[string]*list.Element}添加key
目录概述MVCC做了什么锁做了什么为啥幻读:参考资料:概述笔者在学习数据库相关内容时,发现关于innoDB在RR级别下究竟能不能保证不发生幻读这个问题,网上的资料众说纷纭,笔者在经过总结和自己的试验之后,在这里结合自己的理解分析一下这个问题,若有谬误,欢迎指正。笔者在这里默认读者都了解了关于幻读以及innoDB中MVCC和锁机制的情况,仅对该问题进行分析。先说结论,innoDB的RR级别下仍然会出现幻读的情况,但是innoDB还是通过MVCC和锁尽可能避免幻读发生。MVCC做了什么首先,关于MVCC,在RR级别下,MVCC只会在事务的首个查询发生时生成一个ReadView,后续的相同查询都是共
目录概述MVCC做了什么锁做了什么为啥幻读:参考资料:概述笔者在学习数据库相关内容时,发现关于innoDB在RR级别下究竟能不能保证不发生幻读这个问题,网上的资料众说纷纭,笔者在经过总结和自己的试验之后,在这里结合自己的理解分析一下这个问题,若有谬误,欢迎指正。笔者在这里默认读者都了解了关于幻读以及innoDB中MVCC和锁机制的情况,仅对该问题进行分析。先说结论,innoDB的RR级别下仍然会出现幻读的情况,但是innoDB还是通过MVCC和锁尽可能避免幻读发生。MVCC做了什么首先,关于MVCC,在RR级别下,MVCC只会在事务的首个查询发生时生成一个ReadView,后续的相同查询都是共
MySQL服务器上存储引擎负责对表中数据的读取和写入工作,不同存储引擎中存放的格式一般是不同的,甚至有的存储引擎(Memory)不用磁盘来存储数据。 页(Page)是磁盘和内存之间交互的基本单位,也就是说数据库管理存储空间的基本单位是页,数据库I/O操作的最小单位是页(InnoDB页默认大小16KB)区(Extent)是比页大一级的存储结构,在InnoDB存储引擎中,一个区会分配64个连续的页。因为InnoDB中页的默认大小为16KB,所以一个区的大小是1MB=64*16KB段(Segment)由一个或多个区组成,段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以
MySQL服务器上存储引擎负责对表中数据的读取和写入工作,不同存储引擎中存放的格式一般是不同的,甚至有的存储引擎(Memory)不用磁盘来存储数据。 页(Page)是磁盘和内存之间交互的基本单位,也就是说数据库管理存储空间的基本单位是页,数据库I/O操作的最小单位是页(InnoDB页默认大小16KB)区(Extent)是比页大一级的存储结构,在InnoDB存储引擎中,一个区会分配64个连续的页。因为InnoDB中页的默认大小为16KB,所以一个区的大小是1MB=64*16KB段(Segment)由一个或多个区组成,段中不要求区与区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以
前言相信有很多同学和我一样,第一次碰到LRU(LeastRecentlyUsed)的这个解释「最近最少使用」都不知道是什么意思,用汤家凤老师的话来说:我真的感到匪夷所思啊!最近是表示时间,最少是表示频度,拆开来都知道,但是合在一起就不知道是什么意思了。经过一番搜索后,我发现这可能是国内一些专业名词的通病:翻译问题。甚至百度百科对LRU的解释也是这样:LRU是LeastRecentlyUsed的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最