其他
《叶问》第28期,表里某个字段,同时创建了索引和直方图,执行计划会怎么选择
亲测在有索引的情况下,优化器会选择索引统计信息而非直方图,例如:
"considered_execution_plans": [
{
"table": "`t1`",
"chosen": true,
"plan_prefix": [],
"cost_for_plan": 0.35,
"rows_for_plan": 1,
"best_access_path": {
"considered_access_paths": [
{
"cost": 0.35, cost这个就非常低,所以毫无悬念的选择索引
"rows": 1,
"index": "k1",
"chosen": true,
"access_type": "ref"
},
{
"cause": "heuristic_index_cheaper",
"chosen": false,
"access_type": "range",
"range_details": {
"used_index": "k1"
}
}
]
},
"condition_filtering_pct": 100
}
对于直方图有几点说明:
通常可以依靠索引的执行计划是最好的,直方图统计信息对于非索引列特别有用
直方图并不像MySQL的索引一样会自动维护,必须通过手动去维护,线上建议业务低峰期进行维护
通常来说直方图的适用场景是:
随时间变化不大的值
低基数值
分布不均
直方图无法使用的场景是:
加密表、临时表
JSON数据类型、空间数据类型
已创建唯一索引的单列
更多内容请移步叶老师最新推文:《一文读懂MySQL 8.0直方图》