共计 1770 个字符,预计需要花费 5 分钟才能阅读完成。
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 语句执行则间接返回后果。
如果开启了查问缓存,先将查问后果做缓存操作
返回后果过多,采纳增量模式返回
正文完