首页 > 其他分享 >决战圣地玛丽乔亚Day24

决战圣地玛丽乔亚Day24

时间:2023-03-02 23:56:48浏览次数:51  
标签:乔亚 Union Day24 玛丽 查询 索引 Mysql 排序 优化

高性能Mysql第四版P190~204  学习记录:

联接查询:  

对于Union查询,mysql先把一系列单个查询放在临时表,然后再重新读出临时表中的数据完成Union查询。

在Mysql的概念中,联接作用于每个查询,所以对临时表的读取也是一次联接。

Mysql执行联接的策略是:先在一个表取出单条数据,然后再嵌套到下一个表中寻找匹配行,依次下去,直到所有表中匹配的行,如果最后一次查询没有找到所有,会回溯继续遍历操作。

所以可以理解为嵌套循环+回溯。

 

 

联接查询优化器:

Mysql通过优化器调整表之前的连接顺序,达到更快的性能。但是这是在搜索空间小的可能下,如果搜索空间过大,Mysql可能会选择:“贪婪”搜索方式,需要连接的表超过optimizer_search_dept限制的时候。

有时候对于LEFT和子查询等限定连接顺序的操作,通过减少选择可能性来减小搜索空间。

排序优化:

既然mysql需要调整顺序和进行比较就会涉及到排序的问题。老版本的做法是两次传输排序(读取需要排序数据,排序并读取排序后的数据(随机IO开销大))

新版本的做法是单次传输排序(查询所需要的数据,排序后并返回),缺点是需要预留给这块数据足够多的空间,排序缓冲区的其他元组数据量变少,意味着最后数据合并的次数变多了。

如果需要排序的字段是第一个表的所包含字段,那么会先对第一张表进行排序后在联接查询。其他情况都是先连接完再做排序。Limit操作也是等返回结果后再取,所以limit虽然取很少数据,但是临时空间用的不会少。

 

查询优化器的局限性

虽然查询优化器有时候并不是最优的查询,我们可以通过改查询来高效完成工作。

Union:

Union无法把外层条件复制应用到内存,只能Union连接完成后进行应用,这样会造成使用过多的临时空间的问题。

如:

  (A  

      union 

      B)

      limit  20

如果A表100条,B表100条。  这种外层的条件限制,需要等A和B连接结束后再应用,也就是说临时表是200条取20条。

但是如果:

  (A  

      limit20

      union 

      B

     limit  20)

这种写法就是临时表40条数据,大大缩减了临时表占用空间。    

 

并行执行:

MYSQL做不到,不要白费力气。

 

优化特定类型查询:

优化Count():

cout(*)统计行数

count(指定列名)统计指定列非null的值的个数

count由于需要扫描大量行所以很难优化,在精确度要求不高的场景可以使用近似值。例如没三十分钟算一次,存在缓存中使用,虽然不准确但是也不会误差太多。

还可以去除DISTINCT这种约束来避免文件排序提高性能

 

优化连接查询

1.确保ON和Using的列有索引。索引的顺序也有讲究,例如A连B,如果优化器的顺序是BA,那么只要在A加索引即可,B的索引是用不到的。也要尽量避免索引过多的浪费。

2.确保OrderBy、GroupBy的表达式只设计某个表的列。这样可以直接用索引排序

3.升级后的特性注意关注

 

使用with rollup 优化groupby

可以要求Mysql对返回的分组结果再做一次超级聚合。可以使用withrollup子句来实现。但是需要通过explain观察是否优化,也可以使用explan  select straight_join强制执行计划。

 

优化limit和offset

分页是用limit加偏移量去做。如果每页20条,我查1000页的数据,我需要查1020然后丢弃1000条,这样的性能消耗太大。可以进行优化:

1.覆盖索引

2.限制分页数量,优化大偏移量

3.预先估计出边界值并且存在索引,可以利用B+树的范围搜索的特点查询。between  a  and  b

4.记录上次取数据的位置,下次计算从最新位置开始偏移。

 

优化Union:

如果确实需要服务器消除重复的行,否则一定要用union all, 因为union会给临时表加上distinct选项,导致对整个临时表的数据做唯一检查。事实上,Mysql总是将结果放入临时表,然后再读出,再返回给客户端,很多时候这样做是没有必要的。

标签:乔亚,Union,Day24,玛丽,查询,索引,Mysql,排序,优化
From: https://www.cnblogs.com/dwj-ngu/p/17169991.html

相关文章