前言
SQL作为Web开发是永远来到不的一个话题,天天写SQL,可是你晓得一个SQL是如何执行的吗?
select name from user where id = 1;
下面是一个简略的查问语句,交给数据库去执行,而后返回name。看起来很简略,可是外部的执行过程却很多人都不晓得。
明天就把MySQL拆开看看,看一下它到底是怎么工作的。
SQL根本架构
从上图能够看出,MySQL分为Server
层和存储引擎层
Server层
连接器
连接器次要是与客户端建设连贯, 蕴含本地socket和大多数基于客户端/服务端工具实现的相似于tcp/ip的通信。 连贯胜利之后会同时校验用户的权限,等相干平安计划。如咱们罕用的建设连贯形式
mysql -h ip -P 3306 -u root -p
连贯是能够在-p前面输出明码,然而思考到平安问题 不倡议这样操作,-P 后是端口号,-p 是明码。留神大小写。
登录胜利之后,会校验当然登录账号的权限。后续所有的数据库操作都被以后权限所限度。因而,管理员批改用户权限时,不会立刻失效,须要从新连贯才会失效。
MySQL默认状况下,当一个链接闲暇超过8(60 60 8)小时之后会主动断开连接。然而连接池则认为该被断开的连贯仍然无效。 这个时候如果客户端代码发送申请时,连接池会把曾经生效的代码返回至客户端。这样就会导致代码异样。
通过show global variables like '%timeout%'
可进行查看, 缺省状况下是应用wait_timeout 这个字段。
另外能够用show processlist;
用来显示用户正在运行的线程。
留神:除了 root 用户能看到所有正在运行的线程外,其余用户都只能看到本人正在运行的线程,看不到其它用户正在运行的线程。除非独自个这个用户赋予了PROCESS 权限。
mysql> show processlist;+----+-----------------+-----------+------+---------+------+------------------------+------------------+| Id | User | Host | db | Command | Time | State | Info |+----+-----------------+-----------+------+---------+------+------------------------+------------------+| 4 | event_scheduler | localhost | NULL | Daemon | 461 | Waiting on empty queue | NULL || 13 | root | localhost | NULL | Query | 0 | starting | show processlist |+----+-----------------+-----------+------+---------+------+------------------------+------------------+
查问缓存
当咱们建设连贯之后,执行SQL语句时,会先进行缓存查问(如果开启了缓存查问)。如果之前执行了雷同的SQL语句,则会从缓存中间接返回后果。 这个过程能够了解为SQL文本和查问后果的映射。
然而查问缓存真的能晋升效率吗? 实践上,不倡议开启查问缓存
因为缓存和生效都会有额定的资源耗费,数据产生扭转或者表构造产生扭转时,都会导致缓存生效。最差的状况就是你刚建设了一份缓存,另外一边又有人批改数据。这样导致缓存生效,从新建设了一份新的缓存。
有这些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据生效。所以查问缓存适宜有大量雷同查问的利用,不适宜有大量数据更新的利用
在MySQL8.0的版本删除了查问缓存的性能。
如果你是8.0之前的版本,能够通过以下办法敞开查问缓存:
1、长期敞开,间接执行命令行
set global query_cache_size=0set global query_cache_type=0
2、永恒敞开,批改配置文件my.cnf ,增加上面的配置即可。
query_cache_type=0query_cache_size=0
分析器
当在查问缓存中没有找到对象的查问后果时,这时候就须要分析器对SQL进行解析。比方解析出响应的关键词。如Select(查问)、Delete(删除)等等,同时也会把相应的表明、字段名都剖析进去。如果SQL语法错误,会通知咱们 You have an error in your SQL syntax
优化器
SQL理论的执行程序不肯定就是咱们写的程序。在通过分析器的解析,数据库晓得了咱们要做什么。而后会依照肯定的规定重写SQL。当有多个索引的时候,优化器也会决定去应用哪个索引;当多表关联查问的时候,也会去决定各个表的链接程序。总之,优化器会通过一系列的算法规定去给出一个最优的执行策略。
执行器
SQL通过分析器晓得要做什么,通过优化器晓得该怎么做。最初通过执行器就进入了执行阶段。
首先会依据连贯的账号查看是否有操作该表的权限。如果没有,则返回权限谬误。如果有权限,则继续执行。
关上表的时候,执行器会依据表的引擎 去应用该引擎提供的接口。
存储引擎层
存储引擎层负责数据的存储和提取。
可通过show engines
查看MySQL的存储引擎。存储引擎有 InnoDB
、 MylSAM
、 MEMORY
、 MERGE
等等..
然而咱们罕用的根本是InnoDB
和MylSAM
。
InnoDB在5.5.5版本之后为默认的存储引擎
InnoDB
InnoDB是一个事务型的存储引擎,有行级锁定和外键束缚,提供了具备提交,回滚和解体复原的事务平安,然而比照MyLSAM引擎,写的效率会比差一些,并且会占用更多的磁盘空间以保持数据和索引。
特点:
- 更新多的表,适宜解决多重并发的更新申请。
- 反对事务。
- 能够从劫难中复原(通过bin-log日志等)。
- 外键束缚。只有他反对外键。
- 反对主动减少列属性auto_increment。
MylSAM
Mylsam 存储引擎独立于操作系统,简略说就是可用在windows上应用,也可用将数据转移到Lunex操作系统上。零碎兼容性很好!!!。这种存储引擎在建表的时候,它会创立3个文件。别离是(.frm, .MYD, .MYI),简略阐明一下:.frm 存储表的定义(也就是表构造啦),.MYD 就是表外面的数据,.MYD存储索引。这样的划分操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么.MYD这个文件独自来存放数据天然能够优化数据库的查问等操作。
特点:
1、不反对事务
2、不反对外键
3、查问速度很快。如果数据库insert和update的操作比拟多的话采纳表锁效率低(倡议应用innodb)。
4、对表进行加锁
总结
Server层涵盖了MySQL执行的大多数的外围性能,以及各种各样的内置函数,比方工夫、日期等,不论应用的是什么存储引擎,它的Server层是一样的。以上就是对一个SQL执行流程的简略介绍。感激大家的浏览!
文末福利
肝了全网,43份Java思维导图,须要自取!!!
《Java面试手册》V1.0版本,高清PDF收费获取