mysql的执行流程和执行顺序

MySQL怎么跑的啊?我给你捋捋。

先说执行流程哈。
客户端发个SQL过来,比如"SELECT FROM users WHERE age > 3 0",服务器就得处理。

第一步:接收请求。
得有个线程接住这个SQL,比如在2 02 3 年某个下午3 点,有个线程就拿到了这个查询。

第二步:解析查询。
MySQL得看这SQL写对没写对。
它会建个解析树,像这么个结构,把SQL拆开看。
要是语法错了,比如少了个逗号,这里就过不去了。

第三步:预处理。
检查表users存在不?年龄这列合法不?得有权限查这个表。
这里会做点优化,比如发现users表有个age索引,可能会用上。

第四步:查询优化。
这是核心!优化器得想咋跑最快。
假设users表有1 00万行,age列有索引,那用索引扫描肯定比全表扫描快。
优化器会选个执行计划,可能用"索引扫描+排序"这种。

第五步:执行计划生成。
比如生成这么个计划:先用age索引找数据,然后取出结果给客户端。
计划得详细,每一步咋干都写清楚了。

第六步:执行查询。
执行引擎开始干活了。
先从索引里找age>3 0的行,比如找到1 000行。
然后可能还要跟orders表join,生成临时表。
用缓存和索引加速。

第七步:返回结果。
把1 000行数据打包发回去。
客户端拿到数据就完了。

再说执行顺序。
MySQL处理SQL是有顺序的,不是乱来的:
1 . FROM子句最先处理。
比如先找到users表,建立表结构。

2 . JOIN子句接着干。
要是WHERE里有ON condition,比如ON age = user_id,就会连接表。
会生成临时表。

3 . WHERE子句过滤数据。
比如把users表1 00万行先筛到1 000行。

4 . GROUP BY分组。
要是SELECT有COUNT(),会按age分组,比如2 0-3 0岁分一组,3 0-4 0岁分一组。

5 . HAVING筛选分组。
比如HAVING COUNT() > 1 00,筛掉小分组。

6 . SELECT挑列。
比如只选name和age列,计算表达式。

7 . ORDER BY排序。
按name升序排。

8 . LIMIT最后取数据。
比如只取前1 0行。

说实话,我刚开始学的时候也没想明白为啥JOIN要在WHERE前面。
后来发现得先知道要连哪两张表,才能过滤条件啊。

你拿张图看看就清楚了。
网上有张图画得特别好,从接收请求到返回结果,每个阶段都标着干啥。
比如预处理阶段会检查权限,执行阶段会用索引。
你看图就懂了。

深入理解MySQL执行过程及执行顺序

MySQL执行SQL,先连接,验证权限,然后缓存语句。
分析语句,优化执行方案。
接着从表查,关联,筛选,分组,聚合,选列,去重,排序,分页。
每步像流水线,优化这过程,SQL跑得快。

说实话,这玩意儿太复杂了。
网上随便找个工具,十几秒就搞定。
当时我也没想明白,这些乱七八糟的代码干啥的。
反正用百度知道的人多了,他们肯定知道咋整。