mysql for循环_高性能Mysql-查询优化(3)

数据和索引的统计信息

1.mysql执行优化器在生成查询执行计划时,需要向存储引擎获取相应的统计信息。

mysql如何执行关联查询

2.mysql认为任何一个查询都是一次关联(并不是查询需要用到两个表匹配才叫关联)

3.mysql对任何关联都执行嵌套循环关联操作。(类似于两个for 循环嵌套逐一进行比较,将h)

4.mysql对所有的类型查询都是以相同的方式运行。mysql在from 子句中遇到了子查询,先执行子查询,然后将查询结果放到一个临时表中(临时表中没有任何索引)作为一个普通表对待。

5.mysql中执行关联有很多不同的顺序关联可以得到相同的结果,所以mysql优化器最重要的一部分就是关联查询优化。(找到代价最少的关联顺序,如果不想优化器优化可以在select 后面加上 straight_join 后面都不变,可以使用 查看 Last_query_cost【前一章讲过】的值来查看成本)--绝大多数还是mysql的关联顺序的结果最好,如果是特殊情况可以按照自己的顺序加 straight_join 就可以了。

6.如果可能优化器会遍历每一个表然后逐个做嵌套循环计算每一个执行计划树的成本,但是随着关联表的数量增长,就会有指数增长的关联顺序,(搜索空间)那么优化器会采用贪婪搜索方式查找优化。(这个上限值是optimizer_search_depth来限制的)

7.当然不是所有的关联都会排序,例如子查询,左连接这些是固有顺序。

排序优化

8.排序是一个成本很高的操作,从性能角度考虑,要尽可能避免排序。

9.前面讲过可以使用 索引进行排序,但是如果不能使用索引进行排序的时候,mysql需要自己进行排序。如果数据量小则在内存中进行,如果数据量大则需要使用磁盘。(这两种统称为文件filesort)

10.mysql中通过“排序缓冲区”来对数据在内存中进行 快速排序,如果数据量小于“排序缓冲区”,直接快速排序;如果大于这个缓冲区那么先分块,将每一块排序好了以后放到磁盘上最后进行merge(合并)。

11.两种排序:

  • 两次传输排序:1.读取行之针,和需要排列的数据2.读取排序好的所有数据(随机I/O)。这样会有两次I/O(旧版本使用)
  • 单次传输排序:查询需要的所有列(将数据顺序取出),直接排序返回结果。(这样没有随机I/O,但是会有对排序没有用的其他列值,占用空间)(新版本4.1以后)
  • 总结:当单条记录(非常大,且不是I/O密集程序,可以使用第一种,对于单条记录不大可以使用第二种)可以通过max_length_for_sort_data 来规定列数超过这个数值进行不同的选择

12.排序时mysql使用的临时存储空间,可能会比磁盘上的原表要大几倍:mysql会给每一个排序记录分配固定长度的存储空间必须容纳其中最长的字符串。

13.在关联查询的时候需要排序会有两种情况:1.order by 的所有列来自 关联的第一个表,那么mysql会关联处理第一个表的时候(会排序的所以不是第一个处理)会进行filesort。此时使用explain 来查看extra 会显示 using filesort。2.所有的关联都结束以后,在进行文件排序,explain 中显示的是 using temporary;using filesort。如果还有limit 会在排序之后执行。

14.mysql5.6以后如果使用了limit 不会对所有的数据进行排序,而是会丢掉不需要的数据然后进行排序。

24e87ff577aab6ee0725dc37fbe1b03c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值