- 博客(10)
- 问答 (1)
- 收藏
- 关注
原创 MySQL表连接原理
首先无论是内连接还是外连接,都会有驱动表和被驱动表两种,如果是内连接,那么确定第一个需要查询的表,这个表就是驱动表,例如SELECT * FROM t1 INNER JOIN t2 ON t1.m1 > 1 AND t1.m1 = t2.m2 AND t2.n2 < ‘d’;而ON在外连接中,如果在被连接的表中无法匹配到ON子句中的过滤条件的记录时,被连接表的记录依然会以NULL的形式加入到结果集中。但是在内连接中,ON与WHERE的作用相同,不符合他们子句中的过滤条件时,都不会被加入到最后的结果集中。
2024-08-01 21:47:17
509
原创 MySQL执行单表查询语句的原理
这个查询语句中key1和key3都是索引,普通的查询方法,要么是以key1为索引条件来查询有,也就是设定单点扫描区间[‘a’,‘a’],由于key1不是唯一索引,更不是主键,所以采用的访问方法就是ref,沿着idx_key1的索引在对应区间中定位[‘a’,‘a’],找到对应的id值,然后进行回表得到完整的用户记录,再对用户记录中的key3判断是否符合等于字符‘b’。采用二级索引来执行查询时,每获取一条二级索引记录,就会立刻对其执行回表操作,并不是将所有二级索引记录的主键值都集中完成之后再统一执行回表操作。
2024-07-31 18:15:29
918
原创 适合创建索引的场景
而二级索引列对应的id值并一定是连续的,所以这就导致当读取很多id值并不连续的聚簇索引记录时,这些聚簇索引记录分布在不同的页中,页号也是随机的,因此会造成大量的随机I/O。当我们再插入5的记录时,InnoDB会对主键进行判断,发现5没有大于7,所以会将5插入到67前面,但是再插入前还会判断,到底应该放到页0还是页1,放到页1的话,那么需要将67记录往后移动,这个行为称为页分裂。在通过二级索引+回表额度方式执行查询时,某个扫描区间中包含的二级索引记录数量越多,就会导致回表操作的代价越大。
2024-07-24 17:57:12
579
原创 InnoDB索引底层原理
先用二分法在最上层的“存储目录项页”中定位该主键值在哪个“目录项页”中,确定在哪个“目录项页”中时,再去对应的中间层的“目录项页”中,继续用二分法进行查询,直到确定出该主键值在最末层的哪个记录页中,在该记录页中依旧通过二分法对页目录(槽)进行定位,直至确定在哪一组中,最后在组中依次对比主键值即可。也讲这些页成为B+树的节点。上面说过,每创建一个索引,就会创建出一棵对应的B+树,二级索引也是,与聚簇索引的区别就是,列值不再是主键,,所以通过二级索引的B+树查询的话,最终需要一个“回表”的操作。
2024-07-22 21:20:45
1355
原创 InnoDB索引页的整体结构
InnoDB对分组的规定是,对于Infimum记录所在的分组只能有1条记录,Supremum记录所在的分组拥有的记录条数只能在1~8条之间,剩下的分组中记录的条数范围只能是4 ~ 8条之间。之后每插入一条记录,都会从page Directory页目录中找到对应记录的主键值比带插入记录的主键值大并且差值最小的槽(槽是一个组内最大的那条记录在页面中的地址偏移量,通过槽可以快速找到对应的记录的主键值),然后把该槽对应的记录的n_owned值加1,表示本组内又添加一条记录,直到该组中的记录数等于8个。
2024-07-20 11:58:57
756
空空如也
sqlserver数据库速去数据问题
2016-08-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人