mysql
2018-03-08 16:26:39 0 举报
登录查看完整内容
为你推荐
查看更多
家庭智能监控
作者其他创作
大纲/内容
data
页目录
10
页地址
1
prev指针
8
5
39
13
第四十页
next指针
40
16
2
15
用户数据区
97
目录页
21
4 3b
41
22
5 4 d
页头
第二十页地址
3
18
番外篇:Innodb中读取磁盘的最小单位为页,一次磁盘IO可能会读取多物理相邻的页,所以如果将数据插入到物理相邻的物理块中,间接也可以提高插叙你的速度。Innodb中有聚簇索引和普通索引之分,聚簇索引是根据主键来构建,叶子节点存放的是该主键对应的行记录,而普通索引根据索引列来构建,叶子节点存放的是这一行记录对应的主键的值。所以有一下信息:1、根据主键查询可以直接利用聚簇索引定位所在记录;根据普通索引需要先在普通索引上定位主键,然后在聚簇索引中根据主键找到记录,俗称“回表”2、普通索引叶子节点存储的是主键的值,如果主键是一个很长的字符串,并且有很多个普通索引,将造成普通索引占有很大的物理空间,这也是为什么使用自增id来代替订单号作为主键的原因,另一个原因是自增id在insert的时候可以保证相邻的两条记录可能在一个数据块中,而自设的主键就会失去这种连续性,导致可能插入相邻的记录会在多个数据块中,增加了磁盘的IO。3、如果要查询一整行的记录一定会去聚簇索引中查找,如果根据普通索引查询主键id,则这里就不需要进行回表操作,称之为索引覆盖。有时候我们可以将需要频繁查询的字段加入到联合索引中,这时候就可以不需要进行回表操作,提高查询速度。在有排序操作的时候,最好能够让排序字段上也有索引,因为排序字段添加好索引后,查询的时候就已经有序了,不需要再做排序操作,否则还需要将符合条件的结果集拿到buffer中做排序为什么limit offset太大的时候也不好,当offset太大的时候,buffer中存放的数据就会太多,导致查询变慢
17
5 4d
8 9j
53
第十页地址
第一页
3 3 a
主键索引
7 8e
第十页
7
b+树的特征就是非叶子节点上只会存放索引key,并不会存放对应的数据,对应到mysql中一个节点存放的索引key就会变多。那么一个节点16kb存放的key相比b树就会多的多,即b+树的阶数也就增加,树的高度也就会减少。最终的结果就是查询一个数据所需进行的IO次数就是树的高度,但此时的树的高度比b树是要小的多,一般都是3。另一个特点就是b+树的叶子节点都有相邻的指针,这样做的目的是方便范围查询。
2 2a
7 8 e
3 3a
b字段索引
1 2 a
4 3 b
8 9 j
第八十页
2 2 a
第一页地址
6 3 f
6 3f
所以b树的特征就是在每个节点上的key都会存放key对应的数据,这样每个节点存放的key也就减少了。即B树的阶数就会变小,衍生出来的问题就是树的高度上去了,那么磁盘IO也就增加了(1个节点=16kb)。另一个问题就是如果使用B树做索引,如果是范围查询,那么就需要中序遍历这个B树。对于mysql一次IO就可以填充满一个节点,两次IO就可以填充满2个节点,所以如果所查询的数据在叶子节点,那么IO次数就是树的高度。
1 2a
第二十页
第六十页
0 条评论
回复 删除
下一页