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 语句执行则间接返回后果。
如果开启了查问缓存,先将查问后果做缓存操作返回后果过多,采纳增量模式返回