Mysql进阶知识一
Posted 雾晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql进阶知识一相关的知识,希望对你有一定的参考价值。
mysql逻辑架构
一、Mysql逻辑架构介绍
MySql的架构可以在多种不同的场景中发挥良好的作用,主要体现在MySql的存储引擎上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取分离,这种架构可以根据业务和实际需要选择合适的存储引擎。
注意:
- MySql是分层设计,插件式可插拔引擎,系统优化时头脑中有逻辑架构层。
- MySql 自带优化器,执行顺序不一定是Sql的书写顺序,索引失效可能是优化器的问题,如果不想MySql进行优化可以强制使用书写好的sql语句或者将优化器去除,
MySql逻辑分层
从上图中可以看出,Mysql分了4层,分别是连接层、服务层、引擎层、存储层下面分别介绍
连接层
最上层是客户端和连接服务,包含本地socket通信和大多数基于客户端服务端工具实现的类似TCP/IP通道,主要完成一些类似于连接出来、授权认证以及相关的解决方案,该层引入了线程池概念,通过认证安全接入客户端提供的线程,同样在该层上可以实现基于SSL的安全连接,服务器也会为安全接入的客户端验证它具有的操作权限。
服务层
第二层架构主要是完成大多数核心服务,如sql接口,并完成缓存的查询,SQL分析和优化及内置函数的执行,所有跨存储引擎功能也在这一层实现,如过程,函数等,在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化,如确定查询表的顺序,是否使用索引等,最后生成相应的执行操作,如果是SELECT语句,服务器还会查询内部的缓存,增加缓存空间,在大量读操作环境中能很好的提升系统性能。
服务层构成 | 简介 |
Management Service & Utilities | 系统管理和控制工具 |
SQL interface | SQL接口。接受用户的SQL命令,并且返回用户需要的结果,如Select from 就是调用 Interface |
Parser | 解析器。SQL命令传递到解析器的时候会被解析器验证和解析。 |
Optimizer | 查询优化器,SQL语句在查询会使用查询优化器进行查询的优化,比如有where条件时,优化器会决定先投影还是先过滤。 |
Cache & Buffer | 查询缓存。如果缓存有命中查询结果,查询语句就可以直接在查询缓存中取出数据,这个缓存机制是由一系列小缓存组成的,如表缓存,记录缓存,key缓存,权限缓存。 |
引擎层
存储引擎层,存储引擎真正负责了MySql中的存储和提取,服务器通过API与存储引擎进行通讯,不同的引擎具有不同的功能,我们可以根据自己的实际需要进行选择,目前常用的是MyISAM和InnoDB。
查看MySQL支持的存储引擎命令 :show engines
MyISAM和InnoDB的主要区别
对比项目 | MyISAM | InnoDB |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发场景 | 行锁,操作时只锁某一行,不对其他行有影响,适合高并发操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还缓存真实数据,对内存要求较高,而且内存大小对性能有决定性影响。 |
关注点 | 读性能 | 并发写、事务、资源 |
默认安装 | Y | Y |
默认使用 | N | Y |
自带系统表使用 | Y | N |
引擎层
数据存储层,主要是将数据存储在物理磁盘的文件系统中,并通过存储引擎进行交互。
SQL查询的大致流程
1、查询缓存
mysql客户端通过协议与MySql服务器建立连接,并发送语句,mysql服务器在接受到查询语句后首先查询缓存,如果缓存命中则直接返回结果,否则进行语句解析,在Mysql服务器接收到SQL语句后,会首先访问查询缓存,缓存中同时储存SELECT语句和相应的结果集,如果某个查询已经位于缓存中,服务器就不会再对查询结果进行解析、优化、和执行,而仅仅是将缓存中的结果返回给用户,会大大提升系统性能。
2、语法解析和预处理
MySQL服务器在接收到SQL语句后会根据关键字将SQL语句进行解析,并生成一颗对应的解析树,MYSQL解析器会根据SQL语法规则进行语法效验,和解析查询,预处理则根据SQL规则进一步验证解析树是否合法。
3、查询优化
当解析树通过合法性验证后,优化器会将SQL查询转换成执行计划,一条查询有很多种执行方式,最终返回的结果都是相同的,优化器的作用是找到这些执行方式中最好的作为执行计划
4、使用索引
Mysql默认使用RTREE索引,并且有一个大致的方向,无论怎样折腾SQL至少在目前看来Msql最多只使用表中一个索引。
SQL执行
1、SQL性能下降的原因
- 查询语句写的烂
- 索引失效
- 关联查询使用过多,JOIN关联的数据表过多也会导致查询慢
- 服务器调优各个参数设置问题
2、SQL的执行顺序
传入的SQL语句
SELECT DISTINCT
<select_list>
FROM
<left_table>
<join_type> JOIN <right_table> ON <join_condition>
WHERE
<where_condition>
GROUP BY
<group_by_list>
HAVING
<having_conditon>
ORDER BY
<order_by_condition>
LIMIT <limit_number>
MySQL读的时候
FROM
<left_table>
<join_type> JOIN <right_table> ON <join_condition>
WHERE
<where_condition>
GROUP BY
<group_by_list>
HAVING
<having_conditon>
SELECT DISTINCT
<select_list>
ORDER BY
<order_by_condition>
LIMIT <limit_number>
MySQL读的时候,是先拿表,然后拿条件,然后分组,然后显示字段,再排序、分页,
SQL解析流程图
7种JOIN连接查询图
内连接
左右表共有的部分
select <select_list> from tableA A inner join tableB B on A.key =
B.key
左连接
左表的全部 :左右表共有部分和左表独有部分
select <select_list> from tableA left join tableB B on A.key=B.key
右连接
右表的全部 :左右表共有部分和右表独有部分
select <select_list> from tableA right join tableB B on A.key=B.key
右连接(不包括公共部分)
右表独有部分
select <select_list> from tableA right join tableB B on A.key=B.key where A.key is null
左连接(不包括公共部分)
左表独有部分
select <select_list> from tableA left join tableB B on A.key=B.key where B.key is null
全连接
全部
select <select_list> from tableA full outer join tableB B on A.key = B.key
全连接 不包括公共部分
左表独有的和右表独有的部分
select <select_list> from tableA full outer join tableB B on A.key = B.key where A.key is null or B,key is null
以上是关于Mysql进阶知识一的主要内容,如果未能解决你的问题,请参考以下文章
Mysql查询相关知识(进阶一 基础查询 select,进阶二 where(条件查询))
Mysql查询相关知识(进阶三 排序查询,进阶四:常见函数)