mysql order by convert函数 优化

大家都知道 order by 会导致运行缓慢, 为什么缓慢, 然后怎么解决。 今天来谈谈。

先看一段sql ,
explain select contact_id,department_id,convert(name using gbk) gbk_name from ng_contact where enterprise_id = ‘123’ and department_id = ‘456’ order by contact_level,contact_sort,gbk_name limit 100;

索引:
在这里插入图片描述

这里有什么问题呢, 数据量没起来的时候 是没啥问题 毫秒级。
当数据量超过 200万 也就是要在200万数据中 分页 这个SQL 问题就来了。执行很慢, 分页都需要 5-10秒。这样我们肯定是无法忍受的。
那怎么办呢。 我们发现 order gbk_name 此处会扫描所有数据, 罪魁祸首 convert(name using gbk) gbk_name ,
但是 我又需要这个函数怎么办,
我想到的办法是 把此函数计算的 值 放在一个列里面,但是 又不影响其他, 只能考虑 虚拟列了,
我们先试试创建虚拟列:
alter table ng_contact add column gbk_name_index varchar(255) GENERATED ALWAYS AS (convert(name using gbk));

然后创建索引:
alter table ng_contact add index gbk_name_idx(gbk_name_index);

看这里,依然很慢  Using filesort

再考虑组合索引:
alter table ng_contact add index gbk_name_idx(enterprise_id, department_id, contact_level,contact_sort, gbk_name_index);

再看看 explain :
在这里插入图片描述

接着看看 执行时间 。。是不是飞快:
在这里插入图片描述

由于时间有限, 上面 数据为 120万, 仅供参考 ,优化SQL是个漫长而 细腻的事情。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值