using intersect的解决

前端时间接到公司的一个任务,想把云端服务的cpu的利用率给降下来,在优化慢sql的过程中,阿里云扫描出来的问题的sql中有一条的执行计划是这样的

UPDATE table_name  SET origin_data_id='2024-06-15101102A50',
org_id=1111111,
eid='xxxxxxxxx',
modify_time='2024-06-25 13:00:00.521',
datasyn_status=2,
datasyn_status_desc='aaaaa',
datasyn_msg=''   
 WHERE  rec_status=1
 AND eid = 'xxxxxxxxx' AND org_id = 1111111 AND origin_data_id = '2024-06-15101102A50' AND status = 1 AND datasyn_status = 1

查看执行计划如下:
执行计划

Using intersect(idx_orgid_origindataid_status,idx_datasyn_status);

Using intersect 使用了索引的交叉,分别使用了 idx_orgid_origindataid_status 和 idx_datasyn_status 索引,查询后取两个数据集的交集,说实话,我是第一次见。这种会有一种性能问题,虽然命中索引,但是扫描行数会增加,但是是真的影响性能的时候才需要取解决,不然没必要,还是按照mysql自己的解决方案走最好。如果还是不想用 Using intersect,有一些解决办法,可以直接删除不用的索引,也可以查询的时候强制指定索引,还可以隐藏不需要的索引,或者直接禁止使用这种索引方式。

  1. 直接删除不需要的索引
  2. 禁用 Using intersect
SET optimizer_switch = 'index_merge_intersection=off'
  1. 隐藏索引,不过该功能好像只在 mysql8.0中有,也称为不可见索引
    将索引设置为可见:
ALTER TABLE table_xxxx ALTER INDEX idx_xxxx VISIBLE;

将索引设置为隐藏

ALTER TABLE table_xxxxx ALTER INDEX idx_xxxx INVISIBLE;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

六月的北回归线

砸我吧

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

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

打赏作者

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

抵扣说明:

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

余额充值