MySQL优化器特性(七)成本估算常数

俊达2年前技术文章880


成本估算常数表示执行一些MySQL基础操作时的成本,如读取一个页面,创建一个临时表,比较一条记录,解析一行记录等操作。


mysql.engine_cost和mysql.server_cost表分别记录存储引擎和Server层的常量


engine_cost

mysql> select * from mysql.engine_cost;
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
| engine_name | device_type | cost_name              | cost_value | last_update         | comment | default_value |
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
| default     |           0 | io_block_read_cost     |       NULL | 2020-03-12 18:52:18 | NULL    |             1 |
| default     |           0 | memory_block_read_cost |       NULL | 2020-03-12 18:52:18 | NULL    |          0.25 |


server_cost

mysql> select * from mysql.server_cost;
+------------------------------+------------+---------------------+---------+---------------+
| cost_name                    | cost_value | last_update         | comment | default_value |
+------------------------------+------------+---------------------+---------+---------------+
| disk_temptable_create_cost   |       NULL | 2020-03-12 18:52:18 | NULL    |            20 |
| disk_temptable_row_cost      |       NULL | 2020-03-12 18:52:18 | NULL    |           0.5 |
| key_compare_cost             |       NULL | 2020-03-12 18:52:18 | NULL    |          0.05 |
| memory_temptable_create_cost |       NULL | 2020-03-12 18:52:18 | NULL    |             1 |
| memory_temptable_row_cost    |       NULL | 2020-03-12 18:52:18 | NULL    |           0.1 |
| row_evaluate_cost            |       NULL | 2020-03-12 18:52:18 | NULL    |           0.1 |
+------------------------------+------------+---------------------+---------+---------------+


这里的数据可以直接修改,修改后通过flush optimizer_costs加载生效。

mysql> update mysql.server_cost set cost_value=1 where cost_name = 'row_evaluate_cost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> FLUSH OPTIMIZER_COSTS;
Query OK, 0 rows affected (0.01 sec)


退出当前session,重新登录后查看SQL的成本:

mysql> explain format=tree select * from test_ror;
+----------------------------------------------------+
| EXPLAIN                                            |
+----------------------------------------------------+
| -> Table scan on test_ror  (cost=105.25 rows=105)
 |
+----------------------------------------------------+
1 row in set (0.00 sec)


一般情况下不建议修改这里的数据。


相关文章

MySQL运维实战(7)建立复制

建立复制的基本步骤1、主库开启binlog主库需要配置的关键参数server_id:主备库需要设置为不同。log_bin:binlog文件的前缀,可以指定绝对路径,也可以只指定文件名。若不指定路径,b...

MySQL运维实战(7.1) 开启GTID复制

MySQL从5.6版本开始支持GTID复制。开启GTID之后,主库上执行的每一个事务都有一个全局唯一的ID。GTID由两部分组成:server_uuid和事务序列号。初始化数据库时,会生成一个全局唯一...

MySQL运维实战(4.6) SQL_MODE之NO_BACKSLASH_ESCAPES

设置NO_BACKSLASH_ESCAPES后,反斜杠(\)不作为转义符。不设置NO_BACKSLASH_ESCAPES时,反斜杠(\)用来转义后一个字符mysql> create&n...

MySQL优化器特性(五)单表访问路径

数据库的访问路径(access path)是指从表中获取数据的方式,一般可以通过扫描表或通过索引获取数据。想熟练掌握SQL优化技能,首先需要熟悉单表访问路径。本文先简单介绍MySQL支持的各种单表访问...

MySQL运维实战(2.1) 登录失败次数太多导致主机被block的问题处理

参数max_connect_errorsMySQL有参数max_connect_errors,当一个主机尝试登录MySQL,失败的次数超过了max_connect_errors,则这个主机将无法登录到...

MySQL优化器特性(一)IN和Exists(semijoin)子查询优化策略

这篇文章中的SQL和执行计划在mysql 8.0.31环境下进行测试。测试的表结构和数据:表结构mysql> show create table tp\G...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。