MySQL EXPLAN优化成本常数简介

文章目录

  • 前言
  • 一、server层常数
  • 二、存储引擎层常数
  • 总结


前言

MySQL运行分为两层,Server层以及存储引擎层。
Server层进行连接管理,查询缓存,语法解析,查询优化等操作;存储引擎层执行具体的数据存取操作;
两者执行成本是相互独立互不影响的,计算优化成本的常数也分为两类


一、server层常数

查询server层常数表:

# mysql库
select * from server_cost;
+------------------------------+------------+---------------------+---------+
| cost_name                    | cost_value | last_update         | comment |
+------------------------------+------------+---------------------+---------+
| disk_temptable_create_cost   |       NULL | 2021-12-11 18:02:26 | NULL    |
| disk_temptable_row_cost      |       NULL | 2021-12-11 18:02:26 | NULL    |
| key_compare_cost             |       NULL | 2021-12-11 18:02:26 | NULL    |
| memory_temptable_create_cost |       NULL | 2021-12-11 18:02:26 | NULL    |
| memory_temptable_row_cost    |       NULL | 2021-12-11 18:02:26 | NULL    |
| row_evaluate_cost            |       NULL | 2021-12-11 18:02:26 | NULL    |
+------------------------------+------------+---------------------+---------+
6 rows in set (0.01 sec)

Server层一些操作对应的成本常数:

成本常数名称 默认值 描述
disk_temptable_create_cost 40.0 创建基于磁盘的临时表的成本。如果增大这个值,则会让查询优化器尽可能少地创建基于磁盘的临时表
disk_temptable_row_cost 1.0 向基于磁盘的临时表写入或读取一条记录的成本。如果增大这个值,则会让查询优化器尽可能少地创建基于磁盘的临时表
key_compare_cost 0.1 两条记录进行比较操作的成本,多用在排序操作中。如果增大这个值,则会提升filesort的成本,从而让查询优化器更倾向于使用索引(而不是filesort)完成排序
memory_temptable_create_cost 2.0 创建基于内存的临时表的成本。如果增大这个值,则会让查询优化器尽可能少地创建基于内存的临时表
memory_temptable_row_cost 0.2 向基于内存的临时表写入或读取一条记录的成本。如果增大这个值,则会让查询优化器尽可能少地创建基于内存的临时表
row_evaluate_cost 0.2 读取并检测一条记录是否符合搜索条件的成本。如果增大这个值,可能会让查询优化器更倾向于使用索引(而不是全表扫描)

修改配置之后需要让,mysql重新加载这个配置

UPDATE server_cost SET cost_value = 0.4 WHERE cost_name = 'row_evaluate_cost';
# 重新加载这个配置
FLUSH OPTIMIZER_COSTS;

如果需要恢复成默认值,只需要将cost_value设置为NULL,然后再重新加载这个配置就可以了

二、存储引擎层常数

查询存储引擎层常数表:

# mysql库
SELECT * FROM engine_cost;
+-------------+-------------+------------------------+------------+---------------------+---------+
| engine_name | device_type | cost_name              | cost_value | last_update         | comment |
+-------------+-------------+------------------------+------------+---------------------+---------+
| default     |           0 | io_block_read_cost     |       NULL | 2021-12-11 18:02:26 | NULL    |
| default     |           0 | memory_block_read_cost |       NULL | 2021-12-11 18:02:26 | NULL    |
+-------------+-------------+------------------------+------------+---------------------+---------+
2 rows in set (0.00 sec)

engine_name:成本常数适用的存储引擎的名称。如果该值为default,则意味着对应成本常数适用于所有的存储引擎。
device_type:存储引擎使用的设备类型。这主要是为了区分常规的机械硬盘和固态硬盘。不过在MySQL5.7.22版本中并没有对机械硬盘,固态硬盘的成本进行区分,所以该值默认是0。

存储引擎层一些操作对应的成本常数:

成本常数名称 默认值 描述
io_block_read_cost 1.0 从磁盘上读取一个块对应的成本。请注意这里使用的是"块",而不是"页"。对于InnoDB存储引擎来说,一个页就是一个块,不过对于MyISAM存储引擎来说默认以4,096字节作为一个块
memory_block_read_cost 1.0 与上一个成本常数类似,只不过衡量的是从内存中读取一个块对应的成本

filesort:排序操作无法使用到索引,只能在内存(数据量较少)或者磁盘(数据量比较多)进行排序。

总结

EXPLAN优化方案的成本都是根据数据查询出来的数据 * 常数,然后抉择之后取成本最低的方案。

参考:《MySQL是怎样运行的》

你可能感兴趣的:(MySQL,mysql,数据库)