查询SQL的执行流程

连接器:建立连接、管理权限、短连接或长连接。

查询缓存:MySQL 8 .0 已被删除。
SQL结果会被缓存,但维护成本较高。

分析师:分析SQL,生成AST,检查表/字段。

优化器:生成最优的执行计划,例如索引选择和JOIN顺序。

执行器:执行计划并调用存储引擎API。

InnoDB:支持事务、行级锁、外键和崩溃恢复。

BufferPool:将数据页缓存在内存中,以减少磁盘 I/O。

索引搜索:使用B+树索引定位数据。

性能优化:合理使用索引,减少全表扫描,调整BufferPool。

自己掂量一下。

使用Navicat创建Mysql索引

创建 MySQL 索引只需四个步骤。
1 、打开表格设计界面,连接数据库,右键单击表格,选择“设计表格”。
2 .切换到“索引”选项卡,填写索引名称、选择字段、索引类型和索引方法。
3 、选择常用的NORMAL,BTREE支持范围查询。
不要忘记更改前缀的长度。
4 . 在验证期间执行SHOWINDEXFROM tablename。

索引会消耗空间并减慢写入操作。
你自己看看吧。

MySQl执行SQL过程示例

哎呀,我们来说说MySQL执行SQL的过程。
事情很复杂,我得慢慢说。
首先你要了解SQL引擎(SE)和存储引擎(OE)。
他们是两个主要角色。
SE负责理解你编写的SQL,对其进行优化,然后指示OE在数据库中查找内容。

例如,我写了一条SQL,想从表中查找一些东西。
SE需要首先查看条件,例如“a等于1 ”,然后它会查找名为t1 _1 (a,c)的索引。
该索引必须帮助它找到“a 等于 1 ”的行。
找到之后,把结果给OE,OE遍历数据库,找到所有符合条件的行,然后给SE。

那么,SE就得仔细看看了。
例如,有“b等于2 ”或“c不等于4 ”等条件。
它必须应用这些条件并最终过滤掉满足所有条件的结果。

有时,SQL中存在子查询,例如“从t2 表中查找d等于某个值的行”。
SE要处理这个子查询,要么是逐行查找,要么改写成join操作,这样效率会更高。

执行方法有多种。
例如,直接对每一行执行子查询可能效率不高,因为搜索可能需要重复多次。
或者将子查询的条件提前到主查询的索引扫描阶段,这样可以提高效率。
最强大的是子查询重写,将其变成连接操作,这通常是最快的。

存储引擎和SQL引擎,他们必须配合良好。
存储引擎负责保存和查找数据,SQL引擎负责SQL语句的编写和优化。
它们通过一种称为迭代器模式的方法进行通信,逐一处理数据。

优化和性能,这个很重要。
比如索引用得好,查询就会很快。
当子查询处理得当时,可以提高效率。
一旦理解了这些,你就可以写出更好的SQL,让数据库运行得更快。
唉,说起来容易做起来难。

【进阶】MySQL中的语句执行顺序

嗯...MySQL...2 02 2 年我还在想...
执行顺序...真的很重要。
这和我们写的顺序不一样。

我们来说说FROM...这是从右到左处理表连接。
想一想...例如,在table1 .id=table2 .id上join table1 table2 ...先处理table2 ,然后将其连接到table1 因此...如果表2 的数据量较小并且放在右侧...可以减少中间结果集的大小。
我当时就一头雾水……后来才知道这是一个优化点。

那么where...它从下到上、从右到左过滤数据。
比如WHERE Table1 .status=1 AND Table2 .value>1 00...最好把强过滤条件放在最后...比如Table2 .value>1 00放在前面。
这可能会减少后续操作所涉及的数据量。
这很容易理解。

分组依据...这是从左到右分组。
优化建议...在GROUP BY前面使用WHERE,预先过滤掉无效数据。
分组后不要使用HAVING过滤,没有效果。

有...过滤分组结果。
与 WHERE 类似,但影响不同的对象。

然后选择...这是进行投影操作,选择输出的列或表达式。
请注意,此处仅处理 SELECT 中的别名或计算字段,例如 COUNT()。

Sort by... 对结果集进行排序,通常最后执行。
优化建议是...避免对大量数据进行排序。
可以与 LIMIT 结合使用,以减少排序开销。
是。

表别名和列前缀...连接多个表时,使用别名并将表名附加在列名前面。
例如表1 .列。
这可以减少解析歧义并提高效率。

子查询优化...也就是说,子查询可以被优化器重写为连接操作。
这取决于实施计划。
可以通过EXPLAIN进行分析。

索引使用...where条件尝试使用索引列。
如果GROUP BY和ORDER BY...的列索引对应顺序,就可以避免额外的排序。
这很重要。

让我给你一个小例子... select table1 .name, count(table2 .id) from table1 join table2 on table1 .id=table2 .table1 _id where table2 .value>1 00 group table1 .name by count(table2 .id)>5 order by count(table2 .id) DESC LIMIT 1 0;...这是执行顺序... FROM+JOIN FIRST 连接Table1 和Table2 然后WHERE过滤Table2 .value>1 00的记录。
然后按table1 .name分组。
分组后过滤掉count大于5 的组。
然后 SELECT COUNT(table2 .id) 计算并选择 Table1 .name。
按计数降序排序。
最终 LIMIT 返回前 1 0 项。

验证...您可以使用EXPLAIN SELECT...来查看实际的执行计划。
查看表扫描顺序、索引使用情况等。
这对我帮助很大。

还有优化器提示...您可以使用 STRAIGHT_JOIN 强制连接顺序。
例如,直接从table1 中选择select_table2
简单来说...MySQL的执行顺序是:FROM→WHERE→GroupBY→HAVING→选择→ORDER BY→LIMIT。

理解这个序列...对于编写高效的查询非常有用。
尤其是多表连接、聚合、排序等场景。
通过结合 EXPLAIN 和索引优化...可以显着提高查询性能。