图说mysql,理解所谓的sql优化,数据库优化

@TOC一个自学者的mysql优化之路

前言

作者是一个穷到去不起培训班,甚至买不起教科书的穷人。凭借着对编程的兴趣,遇到问题就百度,搜到各种各样的答案。但是我看不懂文字,每个答案只看懂了几个词。为了验证我看明白了,通过画图把自己看懂的答案串联起来。下面直接上图。

mysql数据库

在这里插入图片描述
解释一下,和大部分百度来的答案一样,数据库的工作是这样的:

1.客户端发来sql请求(只考虑sql语句,其他验证信息暂时忽略),sql发过来当然只是字符串(String)。

2.sql字符串来到数据库第一站是来到了高速缓冲区,然后就在缓冲区找是否有和自己一样的请求。如果有,就拿着高速缓冲区的数据去和看门的验证一下权限,然后就带着数据返回给客户端(这是sql办事效率最高的);那如果高速缓存区没有数据,数据库最要做下一步操作了。

3.数据库开始解释验证sql,然后整理出来执行步骤(最是其他答案说的命令树),这棵树基本上是能预算语句运行的复杂程度的,数据可也会由一套算法去优化(听说没有用)。默认优化做的事情无非就是在找有没有索引,有没有主键,有没有必要全表扫描?然后就生成了最终的命令树,也就是执行计划的前期准备。

4.终于走到执行计划了,执行计划是其他地方百度来的,看样子是转业名词,大概的意思是上面做的工作都是准备,现在做的工作才是真正的执行任务。————执行计划很重要,因为这里也有个缓存区,这个独立于高速缓冲区而存在的。缓冲区会有一些数据,比如前几次sql执行的数据,索引字典等。
如果这次执行有索引,甚至在缓存区有数据,那这次执行任务基本上就是扫描完索引,从缓存中带着数据就返回客户端了(这是最快的一种方式);
还有一种方式,就是有索引,但是缓存区没有数据,那么扫描完索引后,生成一个初始化的表格,每个数值位置都是对应硬盘中某个表的某个位置。同时这时候打开了那些在磁盘中,包含了sql需要的数据的表,并根据地址,直接从表中把数据就拿了过来,生成了要输出的数据表(这种方式也比较快)。
那还有一种方式呢,那就是没有索引的语句,为了完成条件命令,程序必须先打开在磁盘中对应的表,在表中要逐个去扫描满足条件的数值,甚至是整个表去遍历,完成后终于生成了初始化化的输出表,然后从打开的表中取数据(这种方式会慢)。

5.最后一步就是根据需求吧数据整成要客户端需要的模样,返回给客户端。

理解过程中遇到的问题

1.索引是什么?
在浏览的很多答案中,我看到一个词(字典)。看到字典,我想起了solr的配置域(这个不懂没关系),就是一个相对比较小的文件,他记录的是你可能用于搜索的内容,不包含其他无关紧要的内容,增快搜索速度。那么索引也是这样一个东西,每个数字库都有一个字典,这个字典包含了每个表的表头,如果有索引,还会包含这个表的索引列的信息,如下面两张图:
没有索引的字典
在这里插入图片描述
有索引的字典
在这里插入图片描述
索引就像是目录,如果你有一本厚厚的书,要找对应的内容,如果你通过目录去找,肯定比你一页页去翻找得快。当然,目录中的内容我们都希望简短一点,所以有人建议索引列尽量简单,如果不用于搜索的列不要设置成索引,会增加目录的复杂性。

2.最终怎么取数据?
因为是学编程的,我自然会想到内存中不应该存在一样的内容两次。那么数据怎么取,当然是引用传递。直接上图,估计大家能懂。
在这里插入图片描述
明白了吧。
3.那为什么说输出请求的“ * ”号键改成具体字段或别名会加快sql速度呢?
你想一下,字典里面当然是认识‘“ * ”,要计算到底他代表的是哪个字段,然后才能生成对应的输出表格。

优化的猜想

优化,当然考虑的是数据量大的时候。
1.数据太多,我们肯定不希望全表扫描,随意我们要合理设置索引;
2.尽量从内存中取数据,这样是最快的。我们都知道,磁盘读数据慢呀,慢呀。mysql有两个内存区,高速缓冲区和缓存区。尽量合理应用这两个内存,减少和磁盘打交道。数据要存在内存中是有条件的,比如sql语句中不应该包含瞬时变量等,查出来的数据不要太大等。合理优化,加大内存。实在要访问硬盘,那么用固态盘吧。
3.根据原理写合适的sql语句,sql有一个关键字explain用于查看你sql语句的效率的,可以多研究一下。关于sql语句优化的方案别人发了好多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值