前言
select * from test_db.user_info_tab where user_id =123;
1、MySQL 基本架构
总体来说,MySQL大体分为两部分,分别是 Server 层和存储引擎层。
Server 层
- 连接器(Connection Manager):负责处理客户端与服务器之间的连接。它接受来自客户端的请求,并进行身份验证和权限检查,建立和管理连接。
- 查询缓存(Query Cache):在旧版 MySQL 中有,但在较新的版本中已不推荐使用。它能够缓存查询和对应的结果,以提高查询性能。然而,在高并发和大型数据库中,它反而可能成为性能瓶颈,因为它在某些情况下会引起锁和不必要的开销。
- 分析器(Parser):负责分析 SQL 查询语句,验证其语法和语义,确保查询的正确性。它将 SQL 语句转换成内部数据结构供优化器和执行器使用。
- 优化器(Optimizer):接收来自分析器的查询请求,并决定如何最有效地执行查询。优化器的目标是找到最佳的执行路径,选择合适的索引、连接顺序和访问方法,以提高查询性能。
-
执行器(Executor):负责执行优化器生成的执行计划,获取存储引擎返回的数据,并处理客户端请求。它与存储引擎交互,执行查询并返回结果给用户。
存储引擎层
2、连接器
连接命令如下:
mysql -h(ip地址) -P(端口) -u(用户名) -p
mysql -h 127.0.0.1 -P 3306 -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 50
Server version: 8.0.31 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
如果输入密码错误,则会收到一个 Access denied 的错误信息,如下:
mysql -h 127.0.0.1 -P 3306 -u root -p
Enter password: *****
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
连接成功之后,大家就可以直接输入查询SQL,就可以看到结果啦。
mysql> select * from test_db.user_info_tab where user_id =123;
+---------+----------------+------+------+--------+---------+--------------------------+
| id | user_name | age | city | status | user_id | password |
+---------+----------------+------+------+--------+---------+--------------------------+
| 1570091 | XXXXXXXXX | 28 | 深圳 | 活跃 | 123 | 523da7ne+yndc5nb1zWWlA== |
+---------+----------------+------+------+--------+---------+--------------------------+
1 row in set (0.01 sec)
3、查询缓存
在老版本的 MySQL 中,连接成功后,我们执行查询 SQL,会先执行查询缓存。
query_cache_type
设值是否走查询缓存。query_cache_type
也不再存在。因为在高并发和大型数据库环境下,查询缓存可能导致性能问题,并且在实际测试中发现,禁用查询缓存可能会提高整体性能和可伸缩性。4、分析器
select * from test_db.user_info_tab where user_id =123;
它先把关键字 select 解析出来,然后把 user_info_tab 解析成表,user_id 解析成列名。做完词法分析之后,开始做语法分析。语法分析主要就是判断,你的 SQL 是否满足 MySQL 的语法。
mysql> select * rom test_db.user_info_tab where user_id =123;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rom test_db.user_info_tab where user_id =123' at line 1
5、优化器
比如这个查询SQL:
select * from test_db.user_info_tab where user_id =123 and user_name='XX';
经过优化器之后,就来到了执行器阶段。也就是真正执行查询SQL了。
6、执行器
select * from test_db.user_info_tab where user_id =123 ;
- 调用 InnoDb 存储引擎提供的接口,获取 user_info_tab 表的第一行。
- 判断 user_id 是不是为123,如果不是,跳过这一行。如果是,把这一行放到结果集。
- 调用 InnoDb 存储引擎提供的接口,获取 user_info_tab 表的下一行。
- 判断 user_id 是不是为123,如果不是,跳过这一行。如果是,把这一行放到结果集。
- 重复3、4步骤,一直扫描完 user_info_tab 表的所有行。最后把结果集返回客户端。
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/88705.html