【无标题】

【无标题】_第1张图片

页是内存和磁盘之间交互的基本单位

内存中的值修改之后刷到磁盘的时候还是以页为单位的

【无标题】_第2张图片

【无标题】_第3张图片

【无标题】_第4张图片

1)什么要有区? 

实际上页和页之间在物理磁盘中离的是非常远的,因为磁盘中的磁头在去查找页的时候需要做寻道,盘片的旋转都需要时间,这种状况就称之为随机IO,随机IO中磁盘的速度和内存的速度相差了好几个数量级,所以说尽量让链表中相邻的页的物理位置也相邻,所以进行范围查询的时候方便使用顺序IO,尽量让三个页在物理磁盘上是挨着的,是连续存放的,乍样进行寻找的时候就能减少盘片旋转和磁道扫描的过程,这样加载速度就会快很多

分一个区就是为了保证一波页是在物理磁盘时尽量连续的

【无标题】_第5张图片

【无标题】_第6张图片

2)段:

当我们在进行查询数据的时候,只关心叶子结点的这些页,非叶子节点也是页,区中即放叶子节点中的页,也有可能放非叶子节点中的页,也就是目录页,区中只有目录页,又有数据页(B+树的叶子节点),因为数据页和目录页都被放到一个区中,那么这个区中数据也就被放的少了,那么这时候发现数据页不够,于是又要跳到下一个区里面,这些区又不连续,有没有一个区专门进行存放叶子结点的,连续IO,而再来一个区,专门存放非叶子节点的那些页

【无标题】_第7张图片

【无标题】_第8张图片

 【无标题】_第9张图片

1)在key1字段上有索引,首先在聚簇索引的叶子节点上面找到key1>z假设说此时一共有100条记录,如果索引不下推,那么MYSQL会拿着这100个主键ID进行回表查询,回表查询找到100条完成的记录,再进行判断第二个条件

2)此时使用索引下推,再进行筛选key1="%k",减少回表次数,减少随机IO次数

【无标题】_第10张图片

【无标题】_第11张图片

查到了前面条件的数据继续在这个基础上过滤后面的数据,索引中包含这个字段,但是没有使用到这个字段的索引,却可以使用这个字段在索引中进行条件过滤,这种情况就叫做索引下推,Using index 就是没有回表,上面针对于lastname这个条件进行下推了

【无标题】_第12张图片

索引下推主要体现的是索引中有这个字段,但是这个字段又失效了,没有办法使用到索引的这个部分,那么这个时候使用索引条件的下推来对会表的失效的索引列再做一个筛选判断,所以说谈到索引下推就是首先使用联合索引,第二下推的条件列索引失效,但是程序还是根据这个索引列进行了筛选

【无标题】_第13张图片

查询性能B+树比B树高

【无标题】_第14张图片

【无标题】_第15张图片

【无标题】_第16张图片

三藩市

【无标题】_第17张图片

【无标题】_第18张图片 【无标题】_第19张图片

【无标题】_第20张图片

二范式:要想知道表中的某一个字段,必须知道联合主键,这个字段必须由联合主键一起推出来才可以,不能由某一个联合索引的一个字段就可以推出来

【无标题】_第21张图片

上面姓名和年龄只是依赖于联合主键的球员编号和比赛编号没关系

比赛时间和比赛场地只是依赖于联合主键的比赛编号,和球员编号没关系

但是最终得分是完全依赖于主键的,必须由比赛编号和球员编号共同推出来,最终拆分成三张表

【无标题】_第22张图片

二范式解决数据量冗余

【无标题】_第23张图片

【无标题】_第24张图片

【无标题】_第25张图片

【无标题】_第26张图片

【无标题】_第27张图片

而是A->C,B->C,非主键字段不能有任何依赖关系,部门名称依赖于部门编号,部门编号依赖于员工编号

【无标题】_第28张图片

【无标题】_第29张图片

【无标题】_第30张图片

【无标题】_第31张图片

【无标题】_第32张图片

公司名字依赖于顾客id,顾客id依赖于订单id

【无标题】_第33张图片

【无标题】_第34张图片

【无标题】_第35张图片

【无标题】_第36张图片

【无标题】_第37张图片

【无标题】_第38张图片

【无标题】_第39张图片

【无标题】_第40张图片

【无标题】_第41张图片

【无标题】_第42张图片

为什么主键要递增?避免页分裂

【无标题】_第43张图片

【无标题】_第44张图片

keylen联合索引使用的长度

【无标题】_第45张图片 【无标题】_第46张图片

【无标题】_第47张图片

【无标题】_第48张图片

【无标题】_第49张图片

【无标题】_第50张图片

因为如果是使用主键聚簇索引,因为叶子节点存放的是完整的数据,你需要将所有数据都加载到内存中,数据占的有多,内存占用多,所以二级索引叶子节点存放的是主键和字段,成本内存;

【无标题】_第51张图片

【无标题】_第52张图片

【无标题】_第53张图片

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来代替子查询

【无标题】_第54张图片 

【无标题】_第55张图片

排序优化:order by不加limit索引失效,order by顺序错误索引失效,规则不一致,无过滤,不索引,

【无标题】_第56张图片 【无标题】_第57张图片

【无标题】_第58张图片

第一个不行,第二个也不行,第三个也不行(顺着来又要逆这来),第四个可以,倒着来即可

【无标题】_第59张图片

1)当我们在进行使用索引的时候只是使用到了age,classID根本就没有管,先筛选过滤,如果将大量的数据都被过滤了,那么此时剩下的数据少了,可能就不再使用索引了,第一 2种就直接回表了

2)第三种不会使用索引,先根据age排序,再找classid=45,那么此时没有limit,可能数据全要,数据量比较大,第四种会使用到索引,相当于是对age排序,先排序,再进行筛选classid=45,返回的数据量也比较少

【无标题】_第60张图片
【无标题】_第61张图片

【无标题】_第62张图片

【无标题】_第63张图片

filesort算法

首先取出order by的列,先进行排序,排好序之后再根据行指针找完整数据,随机IO比较强

但是第二种单路排序对于内存的要求比较高,将随机IO变成顺序IO

【无标题】_第64张图片

【无标题】_第65张图片

【无标题】_第66张图片

【无标题】_第67张图片

【无标题】_第68张图片

你可能感兴趣的:(memcache)