登录
首页 >  数据库 >  MySQL

111

来源:SegmentFault

时间:2023-02-24 15:04:39 341浏览 收藏

你在学习数据库相关的知识吗?本文《111》,主要介绍的内容就涉及到MySQL,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

原文链接:https://time.geekbang.org/col...

server 层

连接器

连接器负责跟客户端

mysql -h$ip -P$port -u$user -p

输完命令之后,需要在交互对话里面输入密码。虽然密码也可以直接跟在

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  1 | root | localhost | test | Sleep   |   20 |          | NULL             |
+----+------+-----------+------+---------+------+----------+------------------+
|  2 | root | localhost | test | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
2 row in set (0.00 sec)

客户端太长时间没动静,连接器就会

mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> select SQL_CACHE * from T where ID=10;

mysql> elect * from t where ID=1;

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 'elect * from t where ID=1' at line 1

SQL解析

_经过了分析器,MySQL 就知道要做什么了_。

优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引。或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

- 既可以先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20。
- 也可以先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10。

两种执行方法的

mysql> select * from T where ID=10;

ERROR 1142 (42000):SELECT command denied to user 'b'@'localhost' for table 'T'

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

表T
中,
ID字段没有索引
,执行器的执行流程:
  1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
  2. 调用引擎接口取
    下一行
    ,重复相同的判断逻辑,直到取到这个表的最后一行

执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

对于有索引的表,执行的逻辑也差不多。第一次调用的是

取满足条件的第一行
这个接口,之后循环取
满足条件的下一行
这个接口,这些接口都是引擎中已经定义好的。

慢查询日志的

rows_examined
字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器
每次调用引擎获取数据行
的时候
累加
的。
引擎扫描行数
rows_examined
并不是完全相同的。

存储引擎层

存储引擎负责 MySQL 中数据的存储和读取。服务器通过 API 与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。存储引擎不会解析 SQL

(InnoDb例外,它会解析外键定义,因为MySQL服务器本身没有实现该功能。)
,不同存储引擎之间也不会相互通信,而只是简单地响应上层服务器的请求。

今天关于《111》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表