温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-08-31 16:57:31 来源:亿速云 阅读:231 作者:chen 栏目:MySQL数据库

本篇内容主要讲解“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无法走索引的问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI