mysql的查询执行过程
- 查询缓存
- 在执行一个查询语句前,若查询缓存打开,则mysql会检查这个查询语句是否命中查询缓存中的数据。若命中,则在检查一次权限后,返回查询结果
- 查询缓存实际是一个key-value形式的缓存,通过一个哈希索引作为key(通过查询语句本身等计算出来)
- 查询缓存在对应表作了变化后就会被清空,例如,如果向A表中插入数据,则和A表相关的缓存全部被清空
- 查询缓存可能也会影响性能(如果缓存大且多,则在写表时,会造成短暂的系统僵死,因为要清空缓存)
- 语法解析和预处理(就是进行词法分析和语法分析)
- 对sql语句进行解析,并生成一颗对应的解析树(就是根据语法规则解析sql,如果有错误则直接返回)
- 预处理会根据mysql规则进一步检查解析树是否合法,比如检查要查询的数据表和数据列是否存在。
- 查询优化(优化器)
- 优化器将查询转换为查询计划,一条查询可以有多种执行方式,最后都返回相应的结果。优化器的作用是找到这其中最好的执行计划。查询优化器是生成查询计划的子系统,该系统通常完全处于服务器端,根据要参与连接的表,数据读取方式(索引读取或表扫描)和索引选择等因素来指定查询计划。mysql是基于成本的优化器,其产生多个可供选择的多个执行计划,并从中选出最低成本的执行计划来优化一条sql语句
- 优化器可以从数据字典中获取许多统计信息,例如表中的行数、表中的每个列的分布情况等。优化器可以根据这些信息选择有效的执行计划。
- 即优化器会对表的统计信息进行评估,包括:每张表或者索引的页面个数、索引的基数、索引和数据行的长度、索引的分布情况等。
- 一个最优的执行计划可能会:
- 重新定义表的关联顺序
- 优化MIN/MAX函数(如果该列有索引,直接通过索引获得)
- 提前终止查询
- 优化排序等