查询执行过程
MySQL 的查询过程总的来说分为五个步骤:
- 向 MySQL 服务器发送一条查询请求;
- 服务器首先检查查询缓存,如果命中缓存,则会立刻返回存储在缓存中的数据,否则进入下一阶段;
- 服务对 SQL 进行解析、预处理、再由优化器生成对应的执行计划;
- MySQL 根据执行计划,调用存储引擎 API 来执行查询;
- 将结果返回客户端,同时缓存查询结果。
查询缓存
查询缓存对系统的额外消耗不止在写操作,也在于读操作:
- 任何查询语句在开始之前都必须经过检查,即使这条 SQL 不会命中查询缓存;
- 两条相同的 SQL 语句,其中一条因为大写字母、多余的空格,那会在查询缓存时是不会被命中的,所以规范中我们写 SQL 语句时,要大写都大写,要小写都小写;
- 如果查询结果是可以被缓存的,那么执行完成后,会将结果缓存,但也会为系统带来额外消耗;
- 如果缓存结果相关表的数据进行了更改,则缓存结果就会失效;
查询优化器
MySQL 的查询优化器时一个非常复杂的部件,它使用了非常多的优化策略来生成一个最优的执行计划,比如:
- 重新定义表的关联顺序(多张表关联查询时,并不一定按照 SQL 中指定的顺序进行,但有一些技巧可以指定关联顺序);
- 优化 MIN() 和 MAX() 函数(找某列的最小值,如果该列有索引,只需要查找 B+Tree 索引最左端,反之则可以找到最大值);
- 提前终止查询(比如:使用 LIMIT 时,查找到满足数量的结果集后会立即终止查询);
- 优化排序(在老版本 MySQL 会使用两次传输排序,即先读取行指针和需要排序的字段在内存中对其排序,然后再根据排序结果去读取数据行,而新版本采用的是单次传输排序,也就是一次读取所有的数据行,然后根据给定的列排序。对于 I/O 密集型应用,效率会高很多)。