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

俊达2年前技术文章533


成本估算常数表示执行一些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优化器特性(八)索引范围扫描成本计算

MySQL优化器特性(八)索引范围扫描成本计算

range执行计划中的range表示索引范围扫描。索引范围扫描的执行过程大致如下:1、根据where条件中索引字段的条件,定位到索引结构中的第一条满足条件的记录。2、根据索引中记录的rowid,到表中...

MySQL优化器特性(二)MRR优化

MySQL优化器特性(二)MRR优化

Index Range Scan索引范围扫描的一般步骤:1、根据where条件,从B+树定位到第一条记录。2、从索引页子节点中获取到行号(rowid),根据rowid回表查询数据。3、使用额外的whe...

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

单表range查询时,可以使用MRR优化,先对rowid进行排序,然后再回表查询数据。在表关联的时候,也可以使用类似的优化方法,先根据关联条件取出被关联表的rowid,将rowid缓存在join bu...

 MySQL优化器特性(九)行数评估

MySQL优化器特性(九)行数评估

查询的行数在成本计算中起了很重要的作用:1、row_evaluate_cost和行数直接相关2、需要访问多少索引页面,和行数直接相关。根据页面大小和平均索引条目长度计算每个索引页面的记录数,根据记录数...

MySQL优化器特性(六)表扫描成本计算

全表扫描成本使用optimizer_trace,或者使用explain format=tree, 或者explain format=json,可以查看查询的costmysql> exp...

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

MySQL优化器特性(四)表关联之BNL(Block Nested Loop)和Hash Join

什么是BNLMySQL表关联时,如果关联条件上没有合适的索引,则join时,对于驱动表的每一条记录,都需要全表扫描被驱动表。如果驱动表有多条数据,则需要多次全表扫描被驱动表,查询性能很差。对于这种情况...

发表评论    

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