优化器成本记录表|全方位认识 mysql 系统库

发布时间:2020-08-10 13:48:58 作者:沃趣科技
来源:ITPUB博客 阅读:214

上一期《统计信息记录表|全方位认识 mysql 系统库》中,我们详细介绍了mysql系统库中的统计信息记录表,本期我们将为大家带来系列第五篇《优化器成本记录表|全方位认识 mysql 系统库》,下面请跟随我们一起开始 mysql 系统库的系统学习之旅吧!

01 优化器成本模型概述

为了生成执行计划,优化器使用了基于成本的模型来对各种操作成本进行估算。 优化器具有一组可编辑的默认“成本常量”(这些值存储在mysql系统数据库下的server_cost和engine_cost表中),可用于调节执行计划的决策。

* server_cost: server常规操作需要使用到的优化器成本估算常量值。

* engine_cost: 针对特定存储引擎的操作需要使用到的的优化器成本估算常量值。

服务器启动时会将成本模型表读入内存中,在生成执行计划时使用内存中的值。 表中指定的任何非NULL成本估算常量值优先使用。剩余其他任何NULL常量值在使用时会转换为内置的默认常量值。

成本常量值在服务器运行过程中允许动态修改(通过修改server_cost和engine_cost表实现,修改完成后需要执行FLUSH OPTIMIZER_COSTS语句重新加载),如果发现修改不对或者需要重置,可以直接把响应的成本常量值设置为NULL即可。

对成本常量值的修改的影响类似于全局变量的修改,只对修改之后新的连接生效,对修改之前已经建立的连接不生效(无论是否执行过FLUSH OPTIMIZER_COSTS语句)。

server_cost和engine_cost表中的成本常量数据仅适用于当前实例,对其修改不会进行复制同步。

下面分别对这两张表进行详细说明。

02  优化器成本记录表详解

      2.1. engine_cost

该表提供查询针对特定存储引擎的操作需要使用到的的优化器成本估算常量值。
下面是该表中存储的信息内容。
root@localhost : mysql 01:01:47> select * from engine_cost;
+-------------+-------------+------------------------+------------+---------------------+---------+
| engine_name | device_type | cost_name              | cost_value | last_update         | comment |
+-------------+-------------+------------------------+------------+---------------------+---------+
| default     |           0 | io_block_read_cost     |       NULL | 2017-07-01 14:31:32 | NULL    |
| default     |           0 | memory_block_read_cost |       NULL | 2017-07-01 14:31:32 | NULL    |
+-------------+-------------+------------------------+------------+---------------------+---------+
2 rows in set (0.00 sec)
表字段含义。
engine_cost表的主键包含三列(cost_name,engine_name,device_type),所以这三列组合值必须唯一,不可建多个条目。
该表中记录的有效成本常量值如下:
如果io_block_read_cost和memory_block_read_cost值不同,则执行计划可能会在相同查询的两次运行时发现执行发生了变化(例如: 执行计划不同或者执行时间不同)。例如:假设内存访问的成本低于磁盘访问的成本。在这种情况下,在服务器启动时还未完成将数据读入缓冲池之前与之后,两次执行相同的查询您可能会得到不同的计划。
对io_block_read_cost和memory_block_read_cost参数的更改可能会为查询计划带来收益,例如: 在所有其他条件都相同的情况下,将io_block_read_cost值设置为大于memory_block_read_cost的值会使优化程序更喜欢走通过在内存中查询数据的查询计划。
修改io_block_read_cost的示例信息如下:
# update已有的常量值
UPDATE mysql.engine_cost
  SET cost_value = 2.0
  WHERE cost_name = 'io_block_read_cost';
FLUSH OPTIMIZER_COSTS;
# 为innodb引擎单独插入一行常量值
INSERT INTO mysql.engine_cost
  VALUES ('InnoDB', 0, 'io_block_read_cost', 3.0,
  CURRENT_TIMESTAMP, 'Using a slower disk for InnoDB');
FLUSH OPTIMIZER_COSTS;

      2.2 . serve r_cost

该表提供查询server常规操作需要使用到的优化器成本估算常量值。
面是该表中存储的信息内容。
root@localhost : mysql 01:07:25> select * from server_cost;
+------------------------------+------------+---------------------+---------+
| cost_name                    | cost_value | last_update         | comment |
+------------------------------+------------+---------------------+---------+
| disk_temptable_create_cost   |       NULL | 2017-07-01 14:31:32 | NULL    |
| disk_temptable_row_cost      |       NULL | 2017-07-01 14:31:32 | NULL    |
| key_compare_cost             |       NULL | 2017-07-01 14:31:32 | NULL    |
| memory_temptable_create_cost |       NULL | 2017-07-01 14:31:32 | NULL    |
| memory_temptable_row_cost    |       NULL | 2017-07-01 14:31:32 | NULL    |
| row_evaluate_cost            |       NULL | 2017-07-01 14:31:32 | NULL    |
+------------------------------+------------+---------------------+---------+
6 rows in set (0.00 sec)
表字段含义。
表中记录的内容即为Server识别的成本估算常量,如下:
本期内容就介绍到这里,本期内容参考链接如下:
https://dev.mysql.com/doc/refman/5.7/en/cost-model.html

"翻过这座山,你就可以看到一片海! "。 坚持阅读我们的"全方位认识 mysql 系统库"系列文章分享,你就可以系统地学完它。 谢谢你的阅读,我们下期不见不散!


| 作者简介

罗小波·沃趣科技高级数据库技术专家

IT从业多年,主要负责MySQL 产品的数据库支撑与售后二线支撑。曾参与版本发布系统、轻量级监控系统、运维管理平台、数据库管理平台的设计与编写,熟悉MySQL体系结构,Innodb存储引擎,喜好专研开源技术,多次在公开场合做过线下线上数据库专题分享,发表过多篇数据库相关的研究文章。

推荐阅读:
  1. 带你认识MySQL sys schema
  2. 七、Web服务器Apache的配置和管理

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql 优化 全方位

上一篇:搜狗输入法能够输入日语吗

下一篇:工作区子系统的信息插座与计算机设备的距离保持的范围在多少之内

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》