一条sql查询的流程
连接
mysql默认端口3306,客户端链接服务端的方式也很多:
同步/异步
长链接/短连接
TCP/unix socket
可以通过sql查询连接超时时间、默认最大连接数,可更新最大连接数
连接的session级别和global级别
一个客户端窗口查询,修改某个参数,如果不加global,只会在当前会话中生效。
加了global,其他的链接窗口才会生效
查询缓存
mysql自带了一套缓存模块,但是默认是关闭的,因为很鸡肋,所以缓存一般交给ORM(如mybatis的一级缓存)
8.0中直接被移除了
语法解析和预处理
select name from user where id =1;
这一条sql查询时:
1、先把一个sql拆成一个个单词,上面的sql会拆成8个符号
2、语法解析
3、预处理
查询优化与查询执行计划
优化器:
1、多表关联时以哪个表作为基础表
2、多个索引时选择哪个索引
等等
优化之后生成一个执行计划。
用explain +sql 就能看到执行计划
存储引擎
思考:
数据放在那里
在哪里执行,谁执行
存储引擎的选择:
5.5.5之前创建表默认是 myisam,之后默认都是innoDB
不同的表存放不同的 数据,可以选择不同的存储引擎
Myisam
innoDB
memory
csv
archive
如何选择存储引擎:
执行引擎
执行引擎把数据返回给客户端
mysql 体系结构
总体上可以把mysql分城三层:
1、连接层-----链接客户端
2、server层:
查询缓存、根据sql调用对应的接口、解析sql语句
优化器优化,执行
3、存储引擎---存放数据,再往下是内存和磁盘