MySQL
文章平均质量分 81
Gogo-2020
这个作者很懒,什么都没留下…
展开
-
深入理解InnoDB(8)—单表访问
1. 访问方法MySQL把执行查询语句的方式称之为访问方法或者访问类型。而访问方法大致分为两类全表扫描索引而进行细分的话可以分为以下几类(为了方便说明,先建一个表)CREATE TABLE single_table ( id INT NOT NULL AUTO_INCREMENT, key1 VARCHAR(100), key2 INT, key3 VARCHAR(100), key_part1 VARCHAR(100), key_part2原创 2021-05-09 22:28:32 · 106 阅读 · 0 评论 -
深入理解InnoDB(7)—系统表空间
系统表空间可以看到,系统表空间和独立表空间的前三个页面(页号分别为0、1、2,类型分别是FSP_HDR、IBUF_BITMAP、INODE)的类型是一致的,只是页号为3~7的页面是系统表空间特有的页号3 SYS: Insert Buffer Header 存储Insert Buffer的头部信息页号4 INDEX: Insert Buffer Root 存储Insert Buffer的根页面页号5 TRX_SYS: Transction System 事务系统的相关信息页号6 SYS: Fir原创 2021-05-06 20:46:40 · 169 阅读 · 0 评论 -
深入理解InnoDB(6)—独立表空间
InnoDB的表空间表空间可以看做是InnoDB存储引擎逻辑结构的最高层 ,所有的数据都是存放在表空间中。1. Extent对于16KB的页来说,连续的64个页就是一个区,也就是说一个区默认占用1MB空间大小。每256个区被划分成一组,第一组的前3个页面是固定的(FSP_HDR,IBUF_BITMAP,INODE),每组的前两个页面是固定的(XDES,IBUF_BITMAP)1.1 为什么需要引入区的概念?因为B+树的每一层的节点,都是用一个双向链表连起来的,如果以页作为存储单位的话,在B+树原创 2021-05-06 20:19:41 · 270 阅读 · 0 评论 -
深入理解InnoDB(5)-文件系统
1. 数据库和文件系统的关系像 InnoDB 、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。2.MySQL数据目录区别于MySQL安装目录(安装目录存储了许多控制服务器和客户端程序的命令),数据目录是用来存储MySQL在运行过程中产生的数据2.1 查找MySQL数据目录的位置因为数据目录是记录在系统变量’datadir’中的,因此直接输入命令就在找原创 2021-05-06 09:15:14 · 186 阅读 · 0 评论 -
深入理解InnoDB(4)—索引使用
索引的代价空间上的代价这个是显而易见的,每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,一棵很大的B+树由许多数据页组成,那可是很大的一片存储空间呢。时间上的代价每次对表中的数据进行增、删、改操作时,都需要去修改各个B+树索引。而且我们讲过,B+树每层节点都是按照索引列的值从小到大的顺序排序而组成了双向链表。不论是叶子节点中的记录,还是内节点中的记录(也就是不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单向原创 2021-04-13 09:39:45 · 134 阅读 · 0 评论 -
深入理解InnoDB(3)—索引的存储结构
InnoDB中的索引方案InnoDB中的索引是通过目录项所指向的下一层页号来一层一层去缩小搜索范围,从而达到高效的查询的。通过二分法对页内的目录项和目标值进行比对,查出下一层所在页号,再在该页下进行再次搜索,直到到达叶子节点索引中的目录项其实长得跟我们的用户记录差不多,只不过目录项中的两个列是主键和页号而已,所以InnoDB复用了之前存储用户记录的数据页来存储目录项,为了和用户记录做一下区分,我们把这些用来表示目录项的记录称为目录项记录。页的组成结构也是一样一样的(就是我们前边介绍过的7个部分),都原创 2021-04-12 20:32:39 · 1372 阅读 · 0 评论 -
深入理解InnoDB(2)—页的存储结构
记录头信息上一篇博客说到每行记录都会有记录头信息,用来记录每一行的一些属性delete_mask这个属性标记着当前记录是否被删除,占用1个二进制位,值为0的时候代表记录并没有被删除,为1的时候代表记录被删除掉了。这些被删除的记录之所以不立即从磁盘上移除,是因为移除它们之后把其他的记录在磁盘上重新排列需要性能消耗,所以只是打一个删除标记而已,所有被删除掉的记录都会组成一个所谓的垃圾链表,在这个链表中的记录占用的空间称之为所谓的可重用空间,之后如果有新记录插入到表中的话,可能把这些被删除的记录占用的存.原创 2021-04-12 18:18:26 · 111 阅读 · 0 评论 -
深入理解InnoDB(1)—行的存储结构
InnoDB页InnoDB是将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KBInnoDB行格式我们插入MySQL的记录在InnoDB中可能以4中行格式存储,分别是Compact、Redundant、Dynamic和Compressed行格式,我们可以在创建或修改表的语句中指定我们想要的行格式CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称 ALTER TABLE 表名 ROW_FORMAT=行格式名称CO原创 2021-04-12 15:37:40 · 124 阅读 · 0 评论 -
MySQL-InnoDB索引实现
联合索引提高查询效率的原理MySQL会为InnoDB的每个表建立聚簇索引,如果表有索引会建立二级索引。聚簇索引以主键建立索引,如果没有主键以表中的唯一键建立,唯一键也没会以隐式的创建一个自增的列来建立。聚簇索引和二级索引都是一个b+树,b+树的特点是数据按一定顺序存在叶子节点且每页数据相连。一般情况下使用索引查询时,先查询二级索引的b+树,查到数据并拿数据中保存的主键回查聚簇索引查到所有数据。下面我们举个例子来重现这个过程。以下面表举例,假设表中已经存了部分数据:create table `user.原创 2021-03-18 21:01:21 · 90 阅读 · 0 评论 -
MySQL—隔离级别
READ UNCOMMITED(读未提交)即读取到了正在修改但是却还没有提交的数据,这就会造成数据读取的错误。READ COMMITED(提交读/不可重复读)它与READ UNCOMMITED的区别在于,它规定读取的时候读到的数据只能是提交后的数据。这个级别所带来的问题就是不可重复读。即上一个时间读取到的a的值是1,但是随着修改线程对事务的提交,a的值变为了2,这时候读到的值就是2了,即执行两次相同的读取操作得到的值却不一样。REPEATED READ(可重复读)它是MySQL数据库的默认隔离级原创 2021-02-05 20:46:01 · 39 阅读 · 0 评论