深入解析MySQL中的查询优化器(工作原理详解)

文 / @UTHEME

对于一个SQL语句,查询优化器首先会看看这个语句是否可以转换成JOIN,如果能够转换成JOIN,那么就会进一步对JOIN进行优化,优化的步骤包括条件优化、计算全表扫描成本、找出所有能用到的索引、针对每个索引计算不同的访问方式的成本,最终选出成本最小的索引以及访问方式。

为了了解查询优化器是如何工作的,我们可以先打开优化器日志,然后执行相应的SQL语句,最后查看日志信息来了解查询优化器的工作过程。打开优化器日志的方法是通过设置“optimizer_trace”参数的值为“enabled=on”来开启,执行完SQL语句后查看日志信息,最后通过将“optimizer_trace”参数的值设为“enabled=off”来关闭优化器日志。

查询优化器的工作原则包括:常量传递、等值传递、移除没用的条件以及基于成本查找成本最小的查询执行方案。在执行SQL语句之前,查询优化器首先会找出所有可以使用的执行方案,比较它们的成本,选出成本最小的执行方案去执行查询。执行方案的成本包括I/O成本和CPU成本。I/O成本是指从磁盘加载到内存的过程所耗费的时间,CPU成本是指各种操作(比如读取数据、检测记录是否满足搜索条件、对结果集进行排序等)所耗费的时间。InnoDB存储引擎规定读取一个页面的成本是1.0,读取并检测一条记录是否符合搜索条件的成本是0.2。

基于成本的优化步骤是:根据搜索条件,找出所有可能使用的索引,然后对比不同的索引访问方式的成本,选出成本最小的索引以及访问方式,最后生成执行计划交给存储引擎去执行查询。例如,对于下面的单表查询语句:

select * from employees.titles where emp_no > '10101' and emp_no < '20000' and to_date = '1991-10-10';

优化器会首先找出所有可以使用的索引,比如“employees.titles(emp_no, to_date)”这个联合索引,然后对不同的索引访问方式进行比较,选出成本最小的索引以及访问方式,最终生成执行计划,交给存储引擎去执行查询。

在实际工作中,我们需要对SQL语句和数据库的结构进行优化,以提高查询的性能。了解查询优化器的工作原理,对于我们进行SQL语句和数据库结构的优化是非常有帮助的。同时,我们还可以通过不断地调整SQL语句和数据库结构来优化查询性能,提升系统的整体性能。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。