MYSQL 索引优化坑一(字符集不一致导致不走索引)

1、不走索引的原因是如何发现的

由于字符集不一样(utf8,utf8mb4)导致表之间得join操作执行计划显示没有走索引
查看树形执行计划得知

EXPLAIN FORMAT=TREE
SELECT * FROM(
WITH order_data AS 
(SELECT 
  r.`order_id`,
  r.`team_name`,
  r.`tid`,
  r.`patient_head_url`,
  r.`patient_name`,
  r.`inquiry_type`,
  r.`patient_user_id`,
  r.`doctor_accid`,
  r.`patient_accid`,
  urc.`un_read_count` AS un_read_num,
  lm.`msg_id` 
FROM
  team_order_relation r 
  INNER JOIN team_order_last_message lm 
    ON r.`order_id` = lm.`order_id` 
  INNER JOIN team_order_un_read_count urc 
    ON r.`order_id` = urc.`order_id` 
WHERE r.`doctor_user_id` = 1596005852493486) 
SELECT 
  od.`order_id`,
               m.`send_time` AS lastMessageTime,
               m.`message` AS lastMessage,
               m.`from_accid`,
               m.`from_role`,
               m.`type`,
               m.`custom_message_type`,
               od.`team_name`,
               od.`tid`,
               od.`patient_head_url`,
               od.`patient_name`,
               od.`inquiry_type`,
               od.`patient_user_id`,
               od.`doctor_accid`,
               od.`patient_accid`,
               od.`un_read_num` AS un_read_num
FROM
  order_data od 
  INNER JOIN team_message m 
    ON od.`msg_id` = m.`msgid` 
WHERE m.`delete_flag` = 0 ) t0

结果如下

-> Inner hash join (lm.msg_id = convert(m.msgid using utf8mb4))  (cost=6498.80 rows=2417)
    -> Filter: (m.delete_flag = 0)  (cost=746.44 rows=4028)
        -> Table scan on m  (cost=746.44 rows=40277)
    -> Hash
        -> Nested loop inner join  (cost=6.30 rows=6)
            -> Nested loop inner join  (cost=4.20 rows=6)
                -> Index lookup on r using idx_user_id_order_id (doctor_user_id=1596005852493486), with index condition: (r.order_id is not null)  (cost=2.10 rows=6)
                -> Single-row index lookup on lm using uk_order_id (order_id=r.order_id)  (cost=0.27 rows=1)
            -> Single-row index lookup on urc using uk_order_id (order_id=r.order_id)  (cost=0.27 rows=1)

其中convert(m.msgid using utf8mb4)提示字符集不一致 并且没有走索引

查看执行计划得知

其中typeAll全表扫描,没有走索引,效率低下

2、为了让其走索引做了哪些工作
将字符集改成一致(utf8mb4)后

再次执行执行计划
在这里插入图片描述
此处已走索引

3、走索引总结

除了需要给指定的字段加索引外,表连接还需要看字符串字符编码是否一致,不然Mysql会去做转换导致不能走索引,大的问题背后是些看不起眼的小问题组成的,平时做好每一件小事,就可以规避很多大问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄智力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值