Thresh
①建设连贯(Connectors&Connection Pool)
通过客户端/服务器通信协议与MySQL建设连贯。MySQL 客户端与服务端的通信形式是 “ 半双工 ”。
对于每一个 MySQL 的连贯,时刻都有一个线程状态来标识这个连贯正在做什么。
(半双工:指的某一时刻,要么发送数据,要么接收数据,不能同时。例如晚期对讲机)
线程状态:
show processlist; //查看用户正在运行的线程信息,root用户能查看所有线程,其余用户只能看本人的
id:线程ID,能够应用kill xx;
user:启动这个线程的用户
Host:发送申请的客户端的IP和端口号
db:以后命令在哪个库执行
Command:该线程正在执行的操作命令
Create DB:正在创立库操作
Drop DB:正在删除库操作
Execute:正在执行一个PreparedStatement
Close Stmt:正在敞开一个PreparedStatement
Query:正在执行一个语句
Sleep:正在期待客户端发送语句
Quit:正在退出
Shutdown:正在敞开服务器
Time:示意该线程处于以后状态的工夫,单位是秒
State:线程状态
Updating:正在搜寻匹配记录,进行批改
Sleeping:正在期待客户端发送新申请
Starting:正在执行申请解决
Checking table:正在查看数据表
Closing table : 正在将表中数据刷新到磁盘中
Locked:被其余查问锁住了记录
Sending Data:正在解决Select查问,同时将后果发送给客户端
Info:个别记录线程执行的语句,默认显示前100个字符。想查看残缺的应用show full processlist;
②查问缓存(Cache&Buffer)
这是MySQL的一个可优化查问的中央,如果开启了查问缓存且在查问缓存过程中查问到完全相同的SQL语句,则将查问后果间接返回给客户端;如果没有开启查问缓存或者没有查问到完全相同的 SQL 语句则会由解析器进行语法语义解析,并生成“解析树”。
a. 缓存Select查问的后果和SQL语句
b. 执行Select查问时,先查问缓存,判断是否存在可用的记录集,要求是否完全相同(包含参数值),这样才会匹配缓存数据命中。
c. 即便开启查问缓存,以下SQL也不能缓存
查问语句应用SQL_NO_CACHE
查问的后果大于query_cache_limit设置
查问中有一些不确定的参数,比方now()
d. show variables like '%query_cache%'; //查看查问缓存是否启用,空间大小,限度等
e. show status like 'Qcache%'; //查看更具体的缓存参数,可用缓存空间,缓存块,缓存多少等
③解析器(Parser)
将客户端发送的SQL进行语法解析,生成”解析树”。预处理器依据一些MySQL规定进一步查看“解析树”是否非法,例如这里将查看数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义,最初生成新的“解析树”。
④查问优化器(Optimizer)
依据“解析树”生成最优的执行打算。MySQL应用很多优化策略生成最优的执行打算,能够分为两类:动态优化(编译时优化)、动静优化(运行时优化)。
等价变换策略
5=5 and a>5 改成 a > 5
a < b and a=5 改成b>5 and a=5
基于联结索引,调整条件地位等
优化count、min、max等函数
InnoDB引擎min函数只须要找索引最右边
InnoDB引擎max函数只须要找索引最左边
MyISAM引擎count(*),不须要计算,间接返回
提前终止查问
应用了limit查问,获取limit所需的数据,就不在持续遍历前面数据
in的优化
MySQL对in查问,会先进行排序,再采纳二分法查找数据。比方where id in (2,1,3),变成 in (1,2,3)
⑤查问执行引擎
负责执行 SQL 语句,此时查问执行引擎会依据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,失去查问后果并返回给客户端。若开启用查问缓存,这时会将SQL 语句和后果残缺地保留到查问缓存(Cache&Buffer)中,当前若有雷同的 SQL 语句执行则间接返回后果。
如果开启了查问缓存,先将查问后果做缓存操作
返回后果过多,采纳增量模式返回