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

俊达2年前技术文章1096


成本估算常数表示执行一些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优化器特性(五)单表访问路径

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

MySQL运维实战(5.6) 字符集设置对mysqldump的影响

mysqldump不指定字符集不指定字符集时,默认使用了utf8。可能和环境有关系。mysqldump -uroot test test_load >&n...

MySQL运维实战(4.6) SQL_MODE之NO_BACKSLASH_ESCAPES

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

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

MySQL运维实战之ProxySQL(9.1)ProxySQL介绍

mysql通过复制技术实现了数据库高层面的可用,但是对于应用来说,当后端MySQL发生高可用切换时,应该怎么处理?我们考虑几种方案:1、使用域名绑定。应用通过dns连接后端实例,当后端发生切换后,将d...

MySQL运维实战之备份和恢复(8.9)xtrabackup备份指定表

备份部分表如果实例设置了参数innodb_file_per_table,xtrabackup可以备份部分表。通过--tables,--tables-file,--databases,--databas...

 MySQL运维实战(1.2)安装部署:使用二进制安装部署

MySQL运维实战(1.2)安装部署:使用二进制安装部署

一般在生产环境,我们会使用二进制安装的方式安装MySQL。使用二进制安装,在处理单机多实例、升级MySQL等场景下更加方便。如果有特殊的需求(比如要打一些patch),我们还可以自己编译二进制。1、下...

发表评论    

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