文章目录
前言一、server层常数二、存储引擎层常数总结前言
MySQL运行分为两层,Server层以及存储引擎层。
Server层进行连接管理,查询缓存,语法解析,查询优化等操作;存储引擎层执行具体的数据存取操作;
两者执行成本是相互独立互不影响的,计算优化成本的常数也分为两类
一、server层常数
查询server层常数表:
# mysql库select * from server_cost;+------------------------------+------------+---------------------+---------+| cost_name| cost_value | last_update | comment |+------------------------------+------------+---------------------+---------+| disk_temptable_create_cost | NULL | -12-11 18:02:26 | NULL || disk_temptable_row_cost| NULL | -12-11 18:02:26 | NULL || key_compare_cost | NULL | -12-11 18:02:26 | NULL || memory_temptable_create_cost | NULL | -12-11 18:02:26 | NULL || memory_temptable_row_cost | NULL | -12-11 18:02:26 | NULL || row_evaluate_cost | NULL | -12-11 18:02:26 | NULL |+------------------------------+------------+---------------------+---------+6 rows in set (0.01 sec)
Server层一些操作对应的成本常数:
修改配置之后需要让,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 | -12-11 18:02:26 | NULL || default| 0 | memory_block_read_cost | NULL | -12-11 18:02:26 | NULL |+-------------+-------------+------------------------+------------+---------------------+---------+2 rows in set (0.00 sec)
engine_name:成本常数适用的存储引擎的名称。如果该值为default,则意味着对应成本常数适用于所有的存储引擎。
device_type:存储引擎使用的设备类型。这主要是为了区分常规的机械硬盘和固态硬盘。不过在MySQL5.7.22版本中并没有对机械硬盘,固态硬盘的成本进行区分,所以该值默认是0。
存储引擎层一些操作对应的成本常数:
filesort:排序操作无法使用到索引,只能在内存(数据量较少)或者磁盘(数据量比较多)进行排序。
总结
EXPLAN优化方案的成本都是根据数据查询出来的数据 * 常数,然后抉择之后取成本最低的方案。
参考:《MySQL是怎样运行的》