00:00
好,那么我们这里呢,讲这个查询优化呢,我们关于这个where啊,过滤的关于order by的我们就讲完了,然后接下来的话呢,我们再来看一下这个叫group by和这个limit这样的一个情况,好的,那么这个group的话呢,我们说它的一个使用索引的情况,跟我们这个奥拜啊几乎是一致的啊group拜呢,可以在没有使用这个where这个情况下呢,我们可以呢,直接去使用索引啊,OK是没问题的啊,当然具体怎么用的话呢,也得基于我们这个查询优化器的一个选择啊,看看是不是能够根据这个成本的一个对比啊选择它,对吧。哎,OK,下一个的话呢,说这个group呢,他得先排序呢,再分组啊对吧?哎,那你要是使用这个索引的话呢,已经排好序了,直接分组就OK了,也遵照着我们这个最佳左前缀的这个法则。说当无法呢去使用这个索引列的时候啊,就类似于我们这个order by一样啊,无法使用索引列的话呢,我们啊,像那个order by里边那个file一样,我们就去增加这样的两个,哎,参数的这个值对吧,哎,T buffer size和max for这个啊。嗯,这是这是这个事儿,然后呢,下边这块呢,其实就是我们编写上的一些规则了,前面我们也讲过哈,说这个where的效率呢,要高于having,所以呢,我们能够写在where当中呢,就不要写在having里啊,针对这个非组函数或者叫聚合函数的话呢,我们都建议大家写在这个where里边,对吧。
01:15
说呢,减少使用这个order buy啊,因为呢,他和这个业务呢,来和业业务去沟通一下,说能不排序的话,我们就不要去排序了,或者呢,你放在这个程序端呢,我们去做这个执行啊,因为呢这个order buy啊,Grow by,包括这个distinct,它是比较耗费我们这个CPU资源的啊,前面呢,我们也看到了一些这个order的时候呢,我们并没有使用上这个索引,直接呢,是不是进行fire了,好直接呢,我们就相当于是啊有个where。啊诶,这个有个where啊,然后呢,有个order,直接呢,人家使用上这个字段的索引之后呢,直接就回到我们这个。这个这个什么呀,所以在当中直接就回表了,然后进行这个内存当中的一个排序了,所以呢,它是比较耗费这个CPU资源啊,这个大家一定要去做这个注意。啊,然后呢,下边呢,说包含了这个order啊和这样的查询语句呢,说where的条件过滤出来结果呢,请保持在这个1000以内啊,否则呢,我们这个色后会很慢啊,就给了具体的一个标准。
02:10
好,那go的话呢,我们就说到这儿,接下来的话呢,我们看一看这个叫limit啊,这个limit的话呢,诶,我们这块呢,需要关注的这个点,说到一般的这个分页查询的时候呢,通过创建覆盖索引呢,能够比较好的去提高性能啊覆盖索引呢,咱们下边再讲啊说呢这块呢,我们呃拿一个具体的案例啊来说一个比较头疼的问题啊,大家就看这块儿,我们现在的话呢,从这个student表中啊,去查询这个200万条啊,万两百万这个位置开始的,诶十条记录。啊,大家会觉得这个事儿是不是就很崩溃了啊,我们这里边儿也没有提提供任何的这个字段,而且这块呢,还是select一个星啊,也没办法去用上这个,呃,这个主键索引啊等等啊,那这时候我们要是去执行怎么办啊,那相当于真实当中,就是把这个数据呢,都往我们这个内存中去加载,然后呢,数到这个位置的时候呢,我们取十条数据是不是极其崩溃啊。啊,有点类似于什么呢,嗯。
03:03
啊,比如说啊,路上有一个卖糖葫芦的啊,他离你挺远的,然后你给人家招手啊,人家呢,从大老远的就是啊背着那个糖葫芦那个串儿呢,就过来了是吧,然后过来之后呢,你说啊,说你在糖葫芦呢,看着挺挺好的啊,就说了这句话啊,这是不是就挺崩溃的了啊,然后费了很大的功夫呢,然后你就是做了一个很小的事儿啊,只取了十条数据。啊,那我们就需要呢做一个优化啊,那怎么优化呢?诶那这里边的话呢,我们就考虑啊,尽量呢咱们去使用上这个,比如说这个,呃,这个主键索引啊,或者我们叫做居住索引,这样呢,就不涉及到这个回表的问题了啊你这里边不是查询的星吗。对吧,星的话呢,我们尽量呢,呃,因为你要不是星的话呢,咱们考虑呢,用这个覆盖索引了,你要都是星的话呢,那咱们尽量呢,就使用这个主键索引啊,那使用这个主键索引的话呢,怎么做呢?哎,这里边儿提到了,说如果呢,我们这个主键比如是ID了,本身这个ID呢,它就是一个自增的。啊,那这时候我们构建的你这个,呃,整个这个索引的话呢,直接这个ID呢,就相当于是个升序的方式了,是吧,所以我们就可以呢,直接取这个ID呢,大于啊这个200万,然后厘米的十这样呢去取一下,相当于我们直接定位到这个ID的这个段上啊取十条数据呢就可以了。
04:13
啊,也不用回表是吧,那这样啊,那么有的同学呢,可能会去想这样个问题,说老师啊,说我们这个里边呢,他有可能这个ID呢,人家在赋值的时候呢,我是这个呃一呃三这个七,然后呢,这个二呃五呃六啊然后十这样的方式,就是我们ID的话呢,它不是一个自增的,然后呢,你要是呃这个不自增的情况下呢,我取这个段呢,跟我们这个自增的情况呢,取这个段呢,不是这个数据不一样吗。啊,确实有这个问题哈,诶但是呢,在实际开发当中呢,大家你想一想,比如说你去百度也好,你去这个淘宝也好,我们去查询,比如说第100页的数据,其实我们主要呢,关注的就是啥呢?你后台这个数据量呢,其实很大哈,我们只需要保证你第100页这个数据呢?啊,你别跟你查99页这个数据呢,你给人家查重了是吧?诶在99页出现过了,你就跑到100页,这是不合适的,或者你漏了一些数据,这不行。
05:02
啊,这个是不行的,只要呢,保证这个数据呢,能够不重不漏,然后呢,都能够出现一次啊其实就可以。啊诶,所以呢,这种方式呢,你这个性能很差,我们就选择用这样的方式啊去做啊啊那么这块呢,有一个特别的之处呢,就是有可能我们这个ID呢,确实它不是一个自增的方式,那不是一个自增的方式呢,怎么办呢?哎,这个呢,我们就考虑呢,按照这个ID呢,我们进行一个排序,排完序以后的话呢,这不就直接呢,可以使用我们这个句子索引了。啊,就相当于是我们尽量的都是要往那个句子索引上啊,主键索引上面去靠啊,诶排完序以后的话呢,我们还是使用咱们这个主键索引,然后取出来这个十条数据,诶这十条数据的话呢,我们再通过这样的一个呃,Where的一个关系啊,定位到你这个TD的那个值上,哎,就找这十条数据的就可以,是不是都比这个效能性能要好很多是吧?诶这块呢,在开发中呢,大家还要有这样的一个意识,OK。行,然后呢,我们后边呢,再去讲一下这个覆盖索引,前面呢,有好几个地方呢,都提到了这个覆盖索引哈,诶我们来看一看什么叫这个覆盖索引。
我来说两句