mysql基础知识
收藏于三太子敖丙的数据库基础知识
这个公众号的原创文章非常不错,值得推荐
- mysql的执行流程
tHCWtA.png
主要分为一下几个流程:
- 连接器
- 查询缓存
- 分析器
- 优化器
- 执行器
- 执行引擎
连接器
连接器是负责和客户端建立连接、获取权限、维持和管理连接的。TCP连接成功之后,我们的连接是处于空闲状态的,可以通过来查看连接状态
show processlist
tbZsEV.png
也可以查看服务端设置的超时过期时间
SHOW VARIABLES LIKE ‘%timeout%’;
tbZbCD.png
interactive_timeout为连接超时时间,默认是28800秒也就是8个小时
查询缓存
mysql中的缓存是按照key-value的形式在内存中开辟一块专门的内存区域来维护缓存数据;查询的时候先用sql字符串去缓存中查询,如果能命中就直接返回结果,如果不能命中就执行后面的操作。
mysql缓存只要关联表的结构或数据发生改变时,都会清空缓存中的数据
- 适用场景
适用于写少读多的场景,例如字典表等
ps:由于缓存的存在,可能会导致第一次查询后的执行时间和第一次不一样,可以用SQL_NO_CACHE来取消查询缓存
SELECT SQL_NO_CACHE * FROM t_user ORDER BY id DESC;
语法分析
语法分析主要是将客户端传入的字符串进行sql语法层面的解析
优化器
优化器主要是分析在查询时,那个索引作为最优索引,然后按照一定原则来得到它认为的目标SQL在当前情形下最有效的执行路径,优化器的目的是为了得到目标SQL的执行计划。
-
指定索引字段
-
force index(idx_name)
强制指定用传入的索引字段
- ignore index(idx_name)
强制指定忽略传入的索引字段
- use index(idx_name)
推荐使用传入的索引字段,最后由mysql决定是不是用该索引
use index : 是建议MySQL去使用这个索引.最后到底是用不用, 还是由MySQL来决定.
如果MySQL还是觉得全表扫描来得快, 那即使是有索引, 它还是会使用全表扫描。
force index : 是强制MySQL去使用这个索引. 如果用不上, 就全表. 如果能用上, 就一定会使用该索引.
执行器
执行计划,就是一条SQL语句,在数据库中实际执行的时候,一步步的分别都做了什么。可以通过explain查看执行计划
具体每个字段的含义可以看参考文章
执行引擎
mysql软件的架构设计是上层步骤相同,底层执行引擎可以有多个选择,常用的执行引擎有InnoDB、MyISAM。
不同的执行引擎会产生不同的存储格式以及文件。
- InnoDB与MyISAM的区别
- | 索引方式 | 默认引擎版本 | 简述 |
---|---|---|---|
MyISAM引擎 | 非聚集索引方式 | 5.5版本之前 | 性能极佳,但却不支持事务处理(transaction) |
INNODB引擎 | 聚集索引方式 | 5.5版本 | 和MyISAM相比,它支持ACID兼容的事务 |
执行引擎是最后具体实施执行计划的模块,根据不同的数据表所需要的数据特性不同,因此实际进行实施时会产生不同的文件以及不同的执行方式,把这些放在一起就是不同的执行引擎。
参考资料
mysql-force-index-vs-use-index
MySQL中USE INDEX 和 FORCE INDEX
mysql use index、ignore index、force index用法
MySQL的show global variables like “%timeout%”