页是内存和磁盘之间交互的基本单位
内存中的值修改之后刷到磁盘的时候还是以页为单位的
1)什么要有区?实际上页和页之间在物理磁盘中离的是非常远的,因为磁盘中的磁头在去查找页的时候需要做寻道,盘片的旋转都需要时间,这种状况就称之为随机IO,随机IO中磁盘的速度和内存的速度相差了好几个数量级,所以说尽量让链表中相邻的页的物理位置也相邻,所以进行范围查询的时候方便使用顺序IO,尽量让三个页在物理磁盘上是挨着的,是连续存放的,乍样进行寻找的时候就能减少盘片旋转和磁道扫描的过程,这样加载速度就会快很多
分一个区就是为了保证一波页是在物理磁盘时尽量连续的
2)段:
当我们在进行查询数据的时候,只关心叶子结点的这些页,非叶子节点也是页,区中即放叶子节点中的页,也有可能放非叶子节点中的页,也就是目录页,区中只有目录页,又有数据页(B+树的叶子节点),**因为数据页和目录页都被放到一个区中,那么这个区中数据也就被放的少了,那么这时候发现数据页不够,于是又要跳到下一个区里面,这些区又不连续,**有没有一个区专门进行存放叶子结点的,连续IO,而再来一个区,专门存放非叶子节点的那些页
1)在key1字段上有索引,首先在聚簇索引的叶子节点上面找到key1>z假设说此时一共有100条记录,如果索引不下推,那么MYSQL会拿着这100个主键ID进行回表查询,回表查询找到100条完成的记录,再进行判断第二个条件
2)此时使用索引下推,再进行筛选key1="%k",减少回表次数,减少随机IO次数
查到了前面条件的数据继续在这个基础上过滤后面的数据,索引中包含这个字段,但是没有使用到这个字段的索引,却可以使用这个字段在索引中进行条件过滤,这种情况就叫做索引下推,Using index 就是没有回表,上面针对于lastname这个条件进行下推了
索引下推主要体现的是索引中有这个字段,但是这个字段又失效了,没有办法使用到索引的这个部分,那么这个时候使用索引条件的下推来对会表的失效的索引列再做一个筛选判断,所以说谈到索引下推就是首先使用联合索引,第二下推的条件列索引失效,但是程序还是根据这个索引列进行了筛选
查询性能B+树比B树高
三藩市
二范式:要想知道表中的某一个字段,必须知道联合主键,这个字段必须由联合主键一起推出来才可以,不能由某一个联合索引的一个字段就可以推出来
上面姓名和年龄只是依赖于联合主键的球员编号和比赛编号没关系
比赛时间和比赛场地只是依赖于联合主键的比赛编号,和球员编号没关系
但是最终得分是完全依赖于主键的,必须由比赛编号和球员编号共同推出来,最终拆分成三张表
二范式解决数据量冗余
而是A->C,B->C,非主键字段不能有任何依赖关系,部门名称依赖于部门编号,部门编号依赖于员工编号
公司名字依赖于顾客id,顾客id依赖于订单id
为什么主键要递增?避免页分裂
keylen联合索引使用的长度
因为如果是使用主键聚簇索引,因为叶子节点存放的是完整的数据,你需要将所有数据都加载到内存中,数据占的有多,内存占用多,所以二级索引叶子节点存放的是主键和字段,成本内存;
SQL优化:
select * from type left join book on type.id=book.id;(type 30次,book 20次)
1)join底层就是一个嵌套循环,from后面是驱动表,left join是被驱动表,先从驱动表中取一条数据,然后根据连接条件去被驱动表中找一下匹配关系,每一次都是从type中取一条数据遍历book,一共执行20*30次,在底层还使用了缓冲池
2)现在针对book(card)列建立索引,从我们的驱动表中找一条数据,从被驱动表中进行查找的时候就可以使用索引了,从B+树中找,但是从驱动表中找数据还是走的是全表扫描,左表全要,驱动表一条一条数据全过一遍, 如果只能添加一个索引,那么必须要给被驱动表添加
3)这个表之间的类型必须是相同的,否则有可能因为隐式类型转换而造成索引失效
4)对于内连接来说查询优化器是可以决定谁作为驱动表,谁作为被驱动表出现的,给被驱动表加索引,如果表的连接条件中只能有一个字段有索引,那么有索引的这个字段将会作为被驱动表出现,对于内连接来说,在两个表的连接条件都存在索引的情况下,会选择小表作为驱动表出现,小表驱动大表, 多表关联查询时,小表在前,大表在后,还要针对于大表建立索引
不建议使用子查询建议将子查询SQL拆开结合程序进行多次查询,或者使用join来代替子查询
排序优化:order by不加limit索引失效,order by顺序错误索引失效,规则不一致,无过滤,不索引,
第一个不行,第二个也不行,第三个也不行(顺着来又要逆这来),第四个可以,倒着来即可
1)当我们在进行使用索引的时候只是使用到了age,classID根本就没有管,先筛选过滤,如果将大量的数据都被过滤了,那么此时剩下的数据少了,可能就不再使用索引了,第一 2种就直接回表了
2)第三种不会使用索引,先根据age排序,再找classid=45,那么此时没有limit,可能数据全要,数据量比较大,第四种会使用到索引,相当于是对age排序,先排序,再进行筛选classid=45,返回的数据量也比较少
filesort算法首先取出order by的列,先进行排序,排好序之后再根据行指针找完整数据,随机IO比较强
但是第二种单路排序对于内存的要求比较高,将随机IO变成顺序IO
【无标题】
辅助东皇燕双鹰2023-10-05 2:39
相关推荐
Mephisto.java20 天前
【大数据学习 | 面经】Spark3.x对比2.x有哪些优点Mephisto.java1 个月前
【大数据学习 | Spark】Spark的改变分区的算子亿林网络数据6 个月前
等保主机测评防骗指南(资产调研)张学灿@1 年前
【操作系统基础】【CPU访存原理】:寄存 缓存 内存 外存、内存空间分区、虚拟地址转换、虚拟地址的映射顶子哥1 年前
【日积月累】SpringBoot 通过注解@CacheConfig @Cacheable @CacheEvict @CachePut @Caching使用缓存2301_791362781 年前
众和策略:几点开盘和收盘股票?财经快讯1 年前
港联证券:做空做多怎么操作?软件质量保障1 年前
Google Guava精讲(一)-Guava是什么?能做什么?2301_791362781 年前
问道管理:突然飙涨!10分钟暴拉10倍