arthinking资料

本文主要介绍arthinking资料 方法和在新技术下所面对的“挑战”,方便大家深入理解arthinking资料 过程。本文也将分享arthinking资料 所遇到的问题和应对策略,怎么解决怎么做的问题。
通过深入本文可以理解代码原理,进行代码文档的下载,也可以查看相应 Demo 部署效果。

arthinking我们真的需要背那些MySQL调优手段吗?我觉得是没有必要的,在掌握MySQL存储架构和SQL执行原理的情况下,我们就很自然的明白,为什么要提议这么优化了,甚至能够发现别人提的不太合理的优化手段。

相信大家看过无数的MySQL调优经验贴了,会告诉你各种调优手段,如:

  • 避免 select *;
  • join字段走索引;
  • 慎用in和not in,用exists取代in;
  • 避免在where子句中对字段进行函数操作;
  • 尽量避免更新聚集索引;
  • group by如果不需要排序,手动加上 order by null;
  • join选择小表作为驱动表;
  • order by字段尽量走索引…

其中有些手段也许跟随者MySQL版本的升级过时了。我们真的需要背这些调优手段吗?我觉得是没有必要的,在掌握MySQL存储架构SQL执行原理的情况下,我们就很自然的明白,为什么要提议这么优化了,甚至能够发现别人提的不太合理的优化手段。

在 洞悉MySQL底层架构:游走在缓冲与磁盘之间 这篇文章中,我们已经介绍了MySQL的存储架构,详细对你在MySQL存储索引缓冲IO相关的调优经验中有了一定的其实。

本文,我们重点讲解常用的SQL的执行原理,从执行原理,以及MySQL内部对SQL的优化机制,来分析SQL要如何调优,理解为什么要这样…那样…那样…调优。

arthinking

如果没有特别说明,本文以MySQL5.7版本作为讲解和演示。

阅读完本文,您将了解到:

  • COUNT: MyISAM和InnoDB存储引擎处理count的区别是什么?
  • COUNT: count为何性能差?
  • COUNT: count有哪些书写方式,怎么count统计会快点?
  • ORDER BY: order by语句有哪些排序模式,以及每种排序模式的优缺点?
  • ORDER BY: order by语句会用到哪些排序算法,在什么场景下会选择哪种排序算法
  • ORDER BY: 如何查看和分析sql的order by优化手段(执行计划 + OPTIMIZER_TRACE日志)
  • ORDER BY: 如何优化order by语句的执行效率?(思想:减小行查询大小,尽量走索引,能够走覆盖索引最佳,可适当增加sort buffer内存大小)
  • JOIN: join走索引的情况下是如何执行的?
  • JOIN: join不走索引的情况下是如何执行的?
  • JOIN: MySQL对Index Nested-Loop Join做了什么优化?(MMR,BKA)
  • JOIN: BNL算法对缓存会产生什么影响?有什么优化策略?
  • JOIN: 有哪些常用的join语句?
  • JOIN: 针对join语句,有哪些优化手段?
  • UNION: union语句执行原理是怎样的?
  • UNION: union是如何去重的?
  • GROUP BY: group by完全走索引的情况下执行计划如何?
  • GROUP BY: 什么情况下group by会用到临时表?什么情况下会用到临时表+排序?
  • GROUP BY: 对group by有什么优化建议?
  • DISTINCT: distinct关键词执行原理是什么?
  • 子查询: 有哪些常见的子查询使用方式?
  • 子查询: 常见的子查询优化有哪些?
  • 子查询: 真的要尽量使用关联查询取代子查询吗?
  • 子查询:in 的效率真的这么慢吗?
  • 子查询: MySQL 5.6之后对子查询做了哪些优化?(SEMIJOIN,Materializatioin,Exists优化策略)
  • 子查询: Semijoin有哪些优化策略,其中Materializatioin策略有什么执行方式,为何要有这两种执行方式?
  • 子查询: 除了in转Exists这种优化优化,MariaDB中的exists转in优化措施有什么作用?

arthinking

1、count

存储引擎的区别

  • MyISAM引擎每张表中存放了一个meta信息,里面包含了row_count属性,内存和文件中各有一份,内存的count变量值通过读取文件中的count值来进行初始化。[1]但是如果带有where条件,还是必须得进行表扫描

  • InnoDB引擎执行count()的时候,需要把数据一行行从引擎里面取出来进行统计。

下面我们介绍InnoDB中的count()。

count中的一致性视图

InnoDB中为何不像MyISAM那样维护一个row_count变量呢?

前面 洞悉MySQL底层架构:游走在缓冲与磁盘之间 一文我们了解到,InnoDB为了实现事务,是需要MVCC支持的。MVCC的关键是一致性视图。一个事务开启瞬间,所有活跃的事务(未提交)构成了一个视图数组,InnoDB就是通过这个视图数组来判断行数据是否需要undo到指定的版本。

如下图,假设执行count的时候,一致性视图得到当前事务能够取到的最大事务ID DATA_TRX_ID=1002,那么行记录中事务ID超过1002都都要通过undo log进行版本回退,最终才能得出最终哪些行记录是当前事务需要统计的:

arthinking

row1是其他事务新插入的记录,当前事务不应该算进去。所以最终得出,当前事务应该统计row2,row3。

执行count会影响其他页面buffer pool的命中率吗?

我们知道buffer pool中的LRU算法是是经过改进的,默认情况下,旧子列表(old区)占3/8,count加载的页面一直往旧子列表中插入,在旧子列表中淘汰,不会晋升到新子列表中。所以不会影响其他页面buffer pool的命中率。

count(主键)

count(主键)执行流程如下:

  • 执行器请求存储引擎获取数据;
  • 为了保证扫描数据量更少,存储引擎找到最小的那颗索引树获取所有记录,返回记录的id给到server。返回记录之前会进行MVCC及其可见性的判断,只返回当前事务可见的数据;
  • server获取到记录之后,判断id如果不为空,则累加到结果记录中。

arthinking

count(1)

count(1)与count(主键)执行流程基本一致,区别在于,针对查询出的每一条记录,不会取记录中的值,而是直接返回一个"1"用于统计累加。统计了所有的行。

count(字段)

与count(主键)类似,会筛选非空的字段进行统计。如果字段没有添加索引,那么会扫描聚集索引树,导致扫描的数据页会比较多,效率相对慢点

count(*)

count(*)不会取记录的值,与count(1)类似。

执行效率对比:count(字段) < count(主键) < count(1)

2、order by

以下是我们本节作为演示例子的表,假设我们有如下表:

arthinking

索引如下:

arthinking

对应的idx_d索引结构如下(这里我们做了一些夸张的手法,让一个页数据变小,为了展现在索引树中的查找流程):

arthinking

2.1、如何跟踪执行优化

为了方便分析sql的执行流程,我们可以在当前session中开启 optimizer_trace:

SET optimizer_trace=’enabled=on’;

然后执行sql,执行完之后,就可以通过以下堆栈信息查看执行详情了:

SELECT * FROM information_schema.OPTIMIZER_TRACEG;

以下是

select a, b, c, d from t20 force index(idx_abc)  where a=3 order by d limit 100,2; 

的执行结果,其中符合a=3的有8457条记录,针对order by重点
arthinking资料部分资料来自网络,侵权毕设源码联系删除

区块链毕设网(www.qklbishe.com)全网最靠谱的原创区块链毕设代做网站
部分资料来自网络,侵权联系删除!
资源收费仅为搬运整理打赏费用,用户自愿支付 !
qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台 » arthinking资料

提供最优质的资源集合

立即查看 了解详情