本文讲一下mysql的整体查询过程
基本的框架
客户端 - > 连接器 - > 分析器 -> 优化器 - >执行器 - > 存储引擎
- > 查询缓存 -
这里还有一个缓存的位置,是在连接器处,如果缓存中存在要查询的结果则直接走缓存返回
但在现实中开启缓存的几率比较低
原因:对于一个表的更新操作,这个表上的所有查询缓存都会被清空
因此除了很少更新的配置表外可以使用查询缓存来提高查询速度,一般不建议开启查询缓存
分析器:分析语法及词法,保证sql的正确性
优化器:一条sql可以通过不同的方式获取数据,优化器需要找到最优的查询方式
查找的依赖:统计信息和代码模型
例: select * from A where a = 3 and b = 4 ;
如果表中a都是3, b 只有一条为4, 优化器会选择b的索引进行查询,因为a的区分度不高,且还需要
进行回表操作,导致代价更高
例: select * from S where ( a between 1 and 1000) and (b between 5000 and 10000) order by b limit 1 ;
mysql 会选择哪个索引?
使用a索引需要最多扫描1000行数据,然后在进行排序
使用b索引需要最多扫描50000行数据,不需要进行排序
mysql5.7之前优化器最终会选择b索引,因为受order by的影响
在5.7之后会选择a索引