MySQL总结(一)
1. 架构
MySQL的架构有三层,分别为Connection(连接层)、Service(服务层)和Engines(存储层)。
1.1 Connectors
这个是不同的编程语言访问MySQL。
1.2 Connection
MySQL的连接是通过TCP协议传输的。
mysql -uroot -p #u表示用户 #p表示密码 #这样默认是登录localhost的的mysql, #如果不想登录本机,可以使用-h ip,登录指定ip主机的mysql
一个MySQL服务器可以有多个用户登录
可以使用如下指令查看最大的连接数
SHOW VARIABLES LIKE 'max_connections'
1.3 Serviece
服务层有SQL interface,Parser,Optimizer、Cache
这一层也是SQL语句核心,以SELECT
为例
-
SQL Interface,这一环节主要是接收客户端的SQL语句,并且返回查询到的结果。
-
Parser 解析器
解析器分为词法解析和语法解析
-
词法解析:会把SQL语句分为关键词和非关键词(表名、字段)。构建SQL语法树
-
语法解析:会根据词法解析的结果判断SQL语句是否合法。
-
-
Optimizer(优化器)
会根据SQL语句结合表结构(索引),生成一个执行计划,使用哪些索引、表的连接是否变化(子查询变为外连接)。
-
Cache 缓存
8.0以后弃用了,因为太冗余了。8.0以前SQL语句查询完事会把结果按照key-value的方式放在cache中,SQL语句为key,结果为value,下条SQL语句来了以后,先看是否有key,有的话直接返回结果,没有的话,走正常的查询流程。
1.4 Engines
查看MySQL默认支持的存储引擎
mysql> SELECT @@default_storage_engine; +--------------------------+ | @@default_storage_engine | +--------------------------+ | InnoDB | +--------------------------+ 1 row in set (0.00 sec)
2. SELECT 的执行流程
2.1 连接
2.2 查询缓存(8.0以前)
SELECT
语句为key,query result 为value;这个东西是非常鸡肋的,
-
首先,对于更新频率低的表(静态表),可以用,但是代价太大了。
-
其次,cache的key是以一个
SELECT
为字符串,就算多一个空格也会被判断为不一样,所以缓存命中率极低。
所以MySQL8.0以后就删除了
2.3 解析器
1. 词法解析:生成语法树
-
语法解析
2.3 执行
-
prepare
这个阶段会检查表和字段是否存在,还有会解析 SELECT * FROM table中的*
-
optimizer
会根据SQL优化出一条代价低的执行方案,比如用不用索引,有多个索引可以使用时,使用哪个索引
SELECT * FROM employees; # 只能全表扫描 SELECT * FROM employees WHERE employee_id = 100; # employee_id is primary -》 using index SELECT * FROM employees WHERE employee_id = 100 AND name = 'lang'; # 联合索引employee_id和name,可以用到主键索引和这个索引,那么最终使用哪个,优化器会决定
-
execute
SELECT * FROM employees WHERE employee_id = 100;
-
索引查询
对于primary的索引来说,叶子节点存的是全部的数据,只需要查employee_id = 100的行在不在
-
全表扫描
对于
SELECT * FROM employees WHERE email = 'lang@gmail.com'
email无索引,会使用全表扫描 -
索引下推
对于联合索引age 和name
SELECT * FROM employees WHERE ang > 18 AND name = 'lang'
;如果不用索引下推,当找到age>18的行时,会回表找到记录,看是否name='lang',
使用索引下推时,当找到age>18的行时,先不回表,看看name="lang"吗?如果是,回表;如果不是,继续下一行。
-
须知少日拏云志,曾许人间第一流。