MySQL EXPLAIN FORMAT=JSON中query_cost与cost_info字段解析问询
MySQL查询优化器的预估成本基于mysql.server_cost和mysql.engine_cost表中定义的基准值计算,下面结合你提供的单表范围查询示例,逐个解析JSON输出中的核心成本字段:
顶层query_cost
这是整个查询的预估总成本,单表查询场景下,它直接等于表级cost_info中的prefix_cost;多表连接查询时,则等于最后一个关联表的prefix_cost。示例中该值为2.06,和表级的prefix_cost完全一致。
表级cost_info字段详解
read_cost
代表读取数据的预估成本,包含定位目标数据的基础IO/CPU成本,以及扫描匹配数据行的额外成本。
结合示例计算:默认配置下,基础扫描成本为1,每行额外扫描成本为0.02,示例中rows_examined_per_scan为9,因此:read_cost = 1 + (9-1)*0.02 = 1.16,和输出值完全匹配。
eval_cost
代表评估每行数据是否满足查询条件的成本,计算公式为:eval_cost = rows_produced_per_join * 每行评估成本
默认每行评估成本为0.1,示例中rows_produced_per_join为9,因此:eval_cost = 9 * 0.1 = 0.90,与输出一致。
prefix_cost
这是当前表及之前所有关联表的累计查询成本,等于read_cost + eval_cost。示例中1.16 + 0.90 = 2.06,既作为当前表的累计成本,也成为整个查询的query_cost。
data_read_per_join
代表预估每次连接操作读取的总字节数,用于衡量查询的IO开销规模。示例中该值为288,对应预估的9行数据,每行平均占用32字节(可根据表结构的字段类型、长度估算)。
内容的提问来源于stack exchange,提问作者yugandhar

