《叶问》第28期,表里某个字段,同时创建了索引和直方图,执行计划会怎么选择

2020-06-24 16:54:24 浏览数 (1)

亲测在有索引的情况下,优化器会选择索引统计信息而非直方图,例如:

代码语言:javascript复制
"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数据类型、空间数据类型
    • 已创建唯一索引的单列

0 人点赞