千家信息网

MYSQL字符集不同引起的join无法走索引的问题怎么解决

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,本篇内容主要讲解"MYSQL字符集不同引起的join无法走索引的问题怎么解决",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"MYSQL字符集不同引起的joi
千家信息网最后更新 2025年01月20日MYSQL字符集不同引起的join无法走索引的问题怎么解决

本篇内容主要讲解"MYSQL字符集不同引起的join无法走索引的问题怎么解决",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"MYSQL字符集不同引起的join无法走索引的问题怎么解决"吧!

在对sql进行转换时,可以发现了以下将s表的deptid 转换成utf8mb4 的情况,即是说,两个表在left join时存在关联字段deptid 字符集不同的情况。

on((`SSS`.`d`.`Deptid` = convert(`ppp`.`s`.`Deptid` using utf8mb4))))

细查发现d表的deptid字段是utf8mb4,但是s表的deptid字段是utf8。

而根据经验,两边关联时字段字符集不一确实会导致无法走索引,因为这里是发生了隐式转换了。此时s表上的索引便无法生效。

此时我有个疑问是当以上将条件d.DEPTID = '00001111' 换成s.DEPTID = '00001111',其可以选择了索引,当此时字符集不同的情况仍然存在,发现以上选择d表的主键的原因是clustered_pk_chosen_by_heuristics。因为是主键而选择?这个便不是很理解了

"considered_access_paths": [

{

"access_type": "eq_ref",

"index": "PRIMARY",

"rows": 1,

"cost": 1.2,

"chosen": true,

"cause": "clustered_pk_chosen_by_heuristics"

},

在修改字符集统一为utf8mb4后就正常了:

+----+-------------+-------+------------+-------+----------------------------+-----------------+---------+-------+------+----------+-------+| id | select_type | table | partitions | type  | possible_keys              | key             | key_len | ref   | rows | filtered | Extra |+----+-------------+-------+------------+-------+----------------------------+-----------------+---------+-------+------+----------+-------+|  1 | SIMPLE      | d     | NULL       | const | PRIMARY,INDEX_DEPARTMENT_5 | PRIMARY         | 130     | const |    1 |   100.00 | NULL  ||  1 | SIMPLE      | s     | NULL       | ref   | IND_SHOP_DEPTID            | IND_SHOP_DEPTID | 131     | const |    1 |   100.00 | NULL  |+----+-------------+-------+------------+-------+----------------------------+-----------------+---------+-------+------+----------+-------+
              "ref_optimizer_key_uses": [              {                "table": "`sss`.`department` `d`",                "field": "Deptid",                "equals": "'00001111'",                "null_rejecting": false              },              {                "table": "`sss`.`department` `d`",                "field": "Deptid",                "equals": "'00001111'",                "null_rejecting": false              },              {                "table": "`ppp`.`shop` `s`",                "field": "Deptid",                "equals": "`sss`.`d`.`Deptid`",                "null_rejecting": false              }            ] /* ref_optimizer_key_uses */          },          {            "rows_estimation": [              {                "table": "`sss`.`department` `d`",                "rows": 1,                "cost": 1,                "table_type": "const",                "empty": false              },              {                "table": "`ppp`.`shop` `s`",                "range_analysis": {                  "table_scan": {                    "rows": 998690,                    "cost": 207849                  } /* table_scan */,                  "potential_range_indexes": [                    {                      "index": "PRIMARY",                      "usable": false,                      "cause": "not_applicable"                    },                    {                      "index": "IND_SHOP_DEPTID",                      "usable": true,                      "key_parts": [                        "Deptid",                        "Shopid"                      ] /* key_parts */                    },                    {                      "index": "IND_SHOP_DOMAIN",                      "usable": false,                      "cause": "not_applicable"                    }                  ] /* potential_range_indexes */,                  "setup_range_conditions": [                  ] /* setup_range_conditions */,                  "group_index_range": {                    "chosen": false,                    "cause": "not_single_table"                  } /* group_index_range */,                  "analyzing_range_alternatives": {                    "range_scan_alternatives": [                      {                        "index": "IND_SHOP_DEPTID",                        "ranges": [                          "00001111 <= Deptid <= 00001111"                        ] /* ranges */,                        "index_dives_for_eq_ranges": true,                        "rowid_ordered": true,                        "using_mrr": false,                        "index_only": false,                        "rows": 1,                        "cost": 2.21,                        "chosen": true                      }                    ] /* range_scan_alternatives */,                    "analyzing_roworder_intersect": {                      "usable": false,                      "cause": "too_few_roworder_scans"                    } /* analyzing_roworder_intersect */                  } /* analyzing_range_alternatives */,                  "chosen_range_access_summary": {                    "range_access_plan": {                      "type": "range_scan",                      "index": "IND_SHOP_DEPTID",                      "rows": 1,                      "ranges": [                        "00001111 <= Deptid <= 00001111"                      ] /* ranges */                    } /* range_access_plan */,                    "rows_for_plan": 1,                    "cost_for_plan": 2.21,                    "chosen": true                  } /* chosen_range_access_summary */                } /* range_analysis */              }            ] /* rows_estimation */          },          {            "considered_execution_plans": [              {                "plan_prefix": [                  "`sss`.`department` `d`"                ] /* plan_prefix */,                "table": "`ppp`.`shop` `s`",                "best_access_path": {                  "considered_access_paths": [                    {                      "access_type": "ref",                      "index": "IND_SHOP_DEPTID",                      "rows": 1,                      "cost": 1.2,                      "chosen": true                    },                    {                      "access_type": "range",                      "range_details": {                        "used_index": "IND_SHOP_DEPTID"                      } /* range_details */,                      "chosen": false,                      "cause": "heuristic_index_cheaper"                    }                  ] /* considered_access_paths */                } /* best_access_path */,                "condition_filtering_pct": 100,                "rows_for_plan": 1,                "cost_for_plan": 1.2,                "chosen": true              }            ] /* considered_execution_plans */          },

到此,相信大家对"MYSQL字符集不同引起的join无法走索引的问题怎么解决"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0