客户端/服务端通信
mysql客户端和服务端之间的通信协议是“双半工”的:再任意时刻,要么由服务端向客户端发送数据,反之亦然,但是这两个动作不能同时发生。所以,我们无法将一个消息切成很多独立的小块来分开发送。这也就是一个查询语句很长,所查数据包很大的时候,参数max_allowed_packet就要相对调大的原因
查询状态
mysql的每个连接,任何时间都有一个状态,最简单的方式用show full processlist;查看
sleep: 线程正在等待客户端发出请求
query: 线程正在执行查询
analyzing and statistics: 线程正在收集存储引擎的统计信息,并生成执行计划
copying to tmp table : 线程正在复制临时表
sorting result: 线程正在对结果集进行排序
1)查询缓存:再解析一个查询语句之前,如果查询缓存时打开的,mysql有先查询该查询时否命中于查询缓存中的数据
2)查询优化处理:
1,将sql转化为执行计划
2,解析sql,预处理,优化sql执行计划
导致mysql优化器选择错误执行计划的原因
1) 统计信息不准确
2) 执行计划中的成本估算不等于实际的执行成本
3) 优化模型选择不正确(基于成本的/基于规则的)
mysql中in与or的关系
mysql将in()列表中的数据先进性排序,然后通过二分查找的方式来确定表中的值是否满足条件,对于in()中有大量取值的时候,mysql的处理会更快
查询语句注意点
1)使用等价变换规则
2)使用子查询优化
3)覆盖索引扫描
优化关联查询
1)确保on , using子句中的列上有索引
2)确保group by ,order by 表达式只涉及到一个表中的列