Skip to content

engine_cost

xiaoboluo768 edited this page Jun 7, 2020 · 2 revisions
  • 该表提供查询针对特定存储引擎的操作需要使用到的的优化器成本估算常量值
  • 表结构定义
CREATE TABLE `engine_cost` (
  `engine_name` varchar(64) NOT NULL,
  `device_type` int(11) NOT NULL,
  `cost_name` varchar(64) NOT NULL,
  `cost_value` float DEFAULT NULL,
  `last_update` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `comment` varchar(1024) DEFAULT NULL,
  PRIMARY KEY (`cost_name`,`engine_name`,`device_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0;
  • 表字段含义
  • ENGINE_NAME:此成本估算常量适用的存储引擎的名称。名称不区分大小写。如果该值是缺省值,则表示适用于所有存储引擎。如果Server在读取此表时未识别引擎名称,则会向错误日志写入警告(默认值default除外,这里指的是非法值)
  • device_type:此成本估算常量适用的设备类型。该列旨在为不同的存储设备类型指定不同的成本估算常量,例如:为机械硬盘与固态硬盘指定不同的估算常量值。目前该字段未使用,目前的唯一有效值为0
  • cost_name:与server_cost表中的相同字段含义相同
  • cost_value:与server_cost表中的相同字段含义相同
  • last_update:与server_cost表中的相同字段含义相同
  • comment:与server_cost表中的相同字段含义相同
  • engine_cost表的主键包含三列(cost_name,engine_name,device_type),所以这三列组合值必须唯一,不可建多个条目
  • 表记录内容示例
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)
  • 该表中记录的有效成本常量值如下:
  • io_block_read_cost(默认1.0):从磁盘读取索引或数据块的成本。与增加此值时的查询计划相比,读取更多磁盘块的查询计划与读取更少磁盘块的查询计划相比会被查询计划认为更加昂贵。例如:与读取较少块的范围扫描相比,表扫描被认为是昂贵的
  • memory_block_read_cost(默认1.0):与io_block_read_cost类似,表示从内存缓冲区中读取索引或数据块的估算常量
  • 如果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;

上一篇:proc表 |下一篇:server_cost表

Clone this wiki locally