MySQL in太多过慢的三种解决方案

 更新时间:2024年05月20日 08:53:01   作者:大悠  
在MySQL中有一个配置参数eq_range_index_dive_limit,它的作用是一个等值查询(比如:in 查询),使用扫描索引树的方式分析在MySQL内部叫做index dives,使用索引统计的方式分析在MySQL内部叫做index statistics,本文给大家介绍了MySQL in太多过慢的三种解决方案

MySQL in 太多出现慢的原因

在MySQL中有一个配置参数eq_range_index_dive_limit,它的作用是一个等值查询(比如:in 查询),其等值条件数小于该配置参数,则查询成本分析使用扫描索引树的方式分析,如果大于等于该配置参数,则使用索引统计的方式分析。使用扫描索引树的方式分析在MySQL内部叫做index dives,使用索引统计的方式分析在MySQL内部叫做index statistics

eq_range_index_dive_limit 默认值是 200 .

select * from dogs where id in (1, 2, 3, 4);

结合上面这条 SQL,就是如果 SQL 中 IN 查询字段 id 的值出现的数量小于 eq_range_index_dive_limit,则走索引树扫描分析查询成本,大于等于 eq_range_index_dive_limit,则走索引统计的方式分析查询成本。

扫描索引树的方式分析 SQL 的查询成本,它的好处就是在 IN 查询的值数量不多时,得到的成本结果是精确的,这就意味着 MySQL 可以选择正确的执行计划,保证语句查询的性能。你现在一定有个疑问:为什么说是在 IN 查询的值数量不多时才是精确的,因为扫描性能的原因,MySQL 在 IN 查询的值数量很多的情况下,扫描索引树成本提高,性能下降,导致查询成本分析代价也随之提高了。

索引统计的方式分析 SQL 的查询成本,由于无需扫描索引树,所以,它的优势就是查询成本分析过程快,代价低。但是,它的缺点也很明显,由于无需扫描索引树,通过粗略统计索引使用情况,得出查询成本,导致 MySQL 可能选错执行计划,使得 SQL 查询性能下降。

解决方案

方案一

可以通过拆分 in 的数量, 分批查询.

select * from dogs where id in (1, 2);
select * from dogs where id in (3, 4);

这种方法缺点也明显, 对于分页或者是查询总条件的一部分并不能实现.

方案二

使用 union all 实现内存级别临时表.

select *
from users where task_created > '2020-01-01' and  task_tag_id in ('-1', '1' , ....'1000个');

结果: 在 1 s 631 ms (execution: 172 ms, fetching: 1 s 459 ms) 内检索到从 1 开始的 500 行

select * from users u
    inner join (select -99 as id union all select '1' union all select '-1'
union all select '1' ) as temp on u.task_tag_id = temp.id
where task_created > '2020-01-01'

结果: 在 383 ms (execution: 201 ms, fetching: 182 ms) 内检索到从 1 开始的 500 行

方案三

使用 实体表

创建实体表

create table jump_data
(
    id          bigint auto_increment
        primary key,
    user_id      bigint   default -1                not null comment '人员id',
    hash        varchar(70)          not null comment '当前存储关联 hash 值',
    ref         varchar(100)                comment '关联数据 id',
    ref_long    bigint                             null,
    create_time datetime default CURRENT_TIMESTAMP null comment '创建时间',
    index idx_hash_ref(hash, ref),
    index idx_hash_ref_long(hash, ref)
);
  • 将上面 task_tag_id 插入至 临时表

    可使用 insert values 插入

  • 如果是结果值可以直接使用

    insert select 插入

使用

select *
from users u  inner join jump_data jd on u.hash = '' and u.ref_long = u.id
where task_created > '2020-01-01'

注意点

  • 需要及时清理 jump_data 表
  • 定时需要 truncate 表因为反复的新增和删除导致 MySQL 预估数据不准确导致速度下降

以上就是MySQL in太多过慢的三种解决方案的详细内容,更多关于MySQL in太多过慢的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL多表关联on和where速度对比实测看谁更快

    MySQL多表关联on和where速度对比实测看谁更快

    这篇文章主要介绍了MySQL多表关联on和where速度对比实测看谁更快问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Mysql 实现向上递归查找父节点并返回树结构的示例代码

    Mysql 实现向上递归查找父节点并返回树结构的示例代码

    通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构,今天通过本文给大家介绍Mysql递归查找父节点并返回树结构,感兴趣的朋友一起看看吧
    2022-09-09
  • Mysql 直接查询存储的Json字符串中的数据

    Mysql 直接查询存储的Json字符串中的数据

    本文主要介绍了Mysql直接查询存储的Json字符串中的数据,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • MySQL数据库约束操作示例讲解

    MySQL数据库约束操作示例讲解

    约束是用来限制表中的数据长什么样子的,即什么样的数据可以插入到表中,什么样的数据插入不到表中,下面这篇文章主要给大家介绍了关于如何通过一文理解MySQL数据库的约束与表的设计的相关资料,需要的朋友可以参考下
    2022-11-11
  • Mysql中group by 使用中发现的问题

    Mysql中group by 使用中发现的问题

    当使用MySQL的GROUP BY语句时,根据指定的列对结果进行分组,这种情况通常是由于在 GROUP BY 中选择的字段与其他非聚合字段不兼容,或者在 SELECT 子句中没有正确使用聚合函数所导致的,本文给大家介绍Mysql中group by 使用中发现的问题,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Mysql中存储UUID去除横线的方法

    Mysql中存储UUID去除横线的方法

    这篇文章主要介绍了Mysql中存储UUID去除横线的方法,本文给出了3个Mysql函数实现去除去UUID中的横线,需要的朋友可以参考下
    2015-02-02
  • MySQL存储表情符号小技巧

    MySQL存储表情符号小技巧

    这篇文章主要为大家介绍了MySQL如何存储表情符号的小技巧,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • MySQL单表记录数过大的优化方法

    MySQL单表记录数过大的优化方法

    当MySQL单表记录数过大时,采取合理的优化策略是保障系统高性能的关键,本博客详细介绍了索引优化、分区表、垂直拆分、水平拆分等多种优化手段,并提供了详细的代码示例,感兴趣的朋友一起看看吧
    2024-01-01
  • dubbo中zookeeper请求超时问题:mybatis+spring连接mysql8.0.15的配置

    dubbo中zookeeper请求超时问题:mybatis+spring连接mysql8.0.15的配置

    这篇文章主要介绍了dubbo中zookeeper请求超时问题:mybatis+spring连接mysql8.0.15的配置,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Mysql和文件系统的关联详情

    Mysql和文件系统的关联详情

    这篇文章主要介绍了Mysql和文件系统的关联详情,Mysql常用的存储引擎如InnoDB、MyISAM采用的是文件存储,自然和文件系统挂钩,那么Mysql都有哪些地方用到了文件系统呢,下面我们一起进入文章学习详细内容吧
    2022-09-09

最新评论