MySQL总结(一)

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 解析器

    解析器分为词法解析和语法解析

    1. 词法解析:会把SQL语句分为关键词和非关键词(表名、字段)。构建SQL语法树

    2. 语法解析:会根据词法解析的结果判断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. 词法解析:生成语法树 

  1. 语法解析

2.3 执行

  1. prepare

    这个阶段会检查表和字段是否存在,还有会解析 SELECT * FROM table中的*

  2. 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,可以用到主键索引和这个索引,那么最终使用哪个,优化器会决定
  3. 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"吗?如果是,回表;如果不是,继续下一行。

须知少日拏云志,曾许人间第一流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值