加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

SQL:一种熟悉又陌生的编程语言,你了解他吗?

发布时间:2019-07-20 07:46:56 所属栏目:MySql教程 来源:小姐姐学Python
导读:副标题#e# 一、SQL :一种熟悉又陌生的编程语言 这里有几个关键词;熟悉、陌生、编程语言。 说它熟悉,是因为它是DBA和广大开发人员,操作数据库的主要手段,几乎每天都在使用。说它陌生,是很多人只是简单的使用它,至于它是怎么工作的?如何才能让它更高效

DBA的发展可分为“运维DBA->开发DBA->数据架构师…”。如果只能完成数据库的运维类工作,无疑是技能的欠缺,也是对各人未来发展不利。况且,随着Paas云的逐步推广,对于数据库的运维需求越来越少,对于优化、设计、架构的要求越来越多。因此,SQL优化是每个DBA必须掌握的技能。

现在优化有工具了,很简单的!

的确现在有些工具可以为我们减少些优化分析工作,会自动给出一些优化建议。但是,作为DBA来讲,不仅要知其然,还要知其所以然。况且,数据库优化器本身就是一个非常复杂的组件,很难做到完全无误的优化,这就需要人工的介入,分析。

优化不就是加索引嘛,这有啥!

的确,加索引是一个非常常用的优化手段,但其不是唯一的。且很多情况下,加了索引可能导致性能更差。后面,会有一个案例说明。

四、SQL仍然很重要!

SQL:一种熟悉又陌生的编程语言,你了解他吗?

我们通过一个示例,说明一下理解SQL运行原理仍然很重要。

这是我在生产环境碰到的一个真实案例。Oracle数据库环境,两个表做关联。执行计划触目惊心,优化器评估返回的数据量为3505T条记录,计划返回量127P字节,总成本9890G,返回时间999:59:59。

从执行计划中可见,两表关联使用了笛卡尔积的关联方式。我们知道笛卡尔连接是指在两表连接没有任何连接条件的情况。一般情况下应尽量避免笛卡尔积,除非某些特殊场合。否则再强大的数据库,也无法处理。这是一个典型的多表关联缺乏连接条件,导致笛卡尔积,引发性能问题的案例。

从案例本身来讲,并没有什么特别之处,不过是开发人员疏忽,导致了一条质量很差的SQL。但从更深层次来讲,这个案例可以给我们带来如下启示:

开发人员的一个疏忽,造成了严重的后果,原来数据库竟是如此的脆弱。需要对数据库保持一种"敬畏"之心。

电脑不是人脑,它不知道你的需求是什么,只能用写好的逻辑进行处理。

不要去责怪开发人员,谁都会犯错误,关键是如何从制度上保证不再发生类似的问题。

五、SQL优化法则

下面我们来看看常见的优化法则。这里所说的优化法则,其实是指可以从那些角度去考虑SQL优化的问题。可以有很多种方式去看待它。下面列举一二。

SQL:一种熟悉又陌生的编程语言,你了解他吗?

这里来自阿里-叶正盛的一篇博客里的一张图,相信很多人都看过。这里提出了经典的漏斗优化法则,高度是指我们投入的资源,宽度是指可能实现的收益。从图中可见,“减少数据访问”是投入资源最少,而收益较多的方式;“增加硬件资源”是相对投入资源最多,而收益较少的一种方式。受时间所限,这里不展开说明了。

SQL:一种熟悉又陌生的编程语言,你了解他吗?

这是我总结的一个优化法则,简称为“DoDo”法则。

第一条,“Do Less or not do!”翻译过来,就是尽量让数据库少做工作、甚至不做工作。

怎么样来理解少做工作呢?比如创建索引往往可以提高访问效率,其原理就是将原来的表扫描转换为索引扫描,通过一个有序的结构,只需要少量的IO访问就可以得到相应的数据,因此效率才比较高。这就可以归纳为少做工作。

怎么样来理解不做工作呢?比如在系统设计中常见的缓存设计,很多是将原来需要访问数据库的情况,改为访问缓存即可。这样既提高了访问效率,又减少了数据库的压力。从数据库角度来说,这就是典型的不做工作。

第二条,“If must do,do it fast!”翻译过来,如果数据库必须做这件事件,那么请尽快做完它。

怎么样来理解这句话呢?比如数据库里常见的并行操作,就是通过引入多进程来加速原来的执行过程。加速处理过程,可以少占用相关资源,提高系统整体吞吐量。

六、SQL 执行过程

SQL的执行过程比较复杂,不同数据库有一定差异。下面介绍以两种主流的数据库(Oracle、MySQL)介绍一下。

SQL:一种熟悉又陌生的编程语言,你了解他吗?

用户提交了一条SQL语句

数据库按照SQL语句的字面值计算出一个HASH值

根据HASH值,判断一下在数据库缓冲区中是否存在此SQL的执行计划。

如果不存在,则需要生成一个执行计划(硬解析过程),然后将结果存入缓冲区。

如果存在的话,判断是否为相同SQL(同样HASH值的语句,可能字符不相同;即使完全相同,也可能代表不同的语句。这块不展开说了)

确认是同一条SQL语句,则从缓冲区中取出执行计划。

将执行计划,交给执行器执行。

结果返回给客户端。

SQL:一种熟悉又陌生的编程语言,你了解他吗?

客户提交一条语句

现在查询缓存查看是否存在对应的缓存数据,如有则直接返回(一般有的可能性极小,因此一般建议关闭查询缓存)。

交给解析器处理,解析器会将提交的语句生成一个解析树。

预处理器会处理解析树,形成新的解析树。这一阶段存在一些SQL改写的过程。

改写后的解析树提交给查询优化器。查询优化器生成执行计划。

执行计划交由执行引擎调用存储引擎接口,完成执行过程。这里要注意,MySQL的Server层和Engine层是分离的。

最终的结果有执行引擎返回给客户端,如果开启查询缓存的话,则会缓存。

七、SQL优化器

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读