一次Mysql使用IN大数据量的优化记录

 更新时间:2020年09月28日 08:51:42   作者:chenjunbiao  
这篇文章主要给大家介绍了关于Mysql使用IN大数据量的优化的实战记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

mysql版本号是5.7.28,表A有390W条记录,使用InnoDB引擎,其中varchar类型字段mac已建立索引,索引方法为B-tree。B表仅有5000+条记录。

有一条SQL指令是这样写的:

SELECT * FROM A WHERE mac IN("aa:aa:aa:aa:aa:aa","bb:bb:bb:bb:bb:b",...此外省略900+条)

通过查询出来的结果耗时294.428s。没错,将近5分钟。

使用EXPLAIN分析下:

访问类型type是range,且已命中索引,rows行也只有587776,可为什么查询耗时要这么久?

mac的索引方法使用了B-tree,那对比下它与HASH的区别,简单地总结下:B-tree索引可以用于进行 =,>,>=,<,<=和between的计算,而HASH只能进行等值运算,不能进行范围查找。那IN是等值运算,两种索引方法都适用。即然这样,把mac的索引方法修改为HASH,同样的查询耗时为。

既然调整索引方法并不能明显地提升语句的查询性能,那只能从语句本身中进行处理。其实明眼人刚开始一看就知道,SELECT * 是很耗性能的,那我们只查业务上需要的字段,语句调整为:

SELECT id,mileage FROM A WHERE mac IN("aa:aa:aa:aa:aa:aa","bb:bb:bb:bb:bb:b",...此外省略900+条)

耗时并没有明显的提升。

竟然IN的方式这么难优化,是不是可以放弃使用LEFT JOIN呢?语句调整为:

SELECT a.id,a.mileage FROM A a LEFT JOIN B b ON b.mac = a.mac WHERE b.create_time >= '2020-01-01'

耗时超过5分钟,放弃。

我们知道,在条件量少的情况,EXISTS和IN的效果没有显示的差别。但条件多的时候,IN要比EXISTS的效率也高,来试下EXISTS:

SELECT id,mileage FROM A a WHERE EXISTS(SELECT mac FROM B WHERE create_time >= '2020-01-01' AND mac = a.mac)

耗时也是超过5分钟,IN的效率确实要比EXISTS高,放弃。

所以最后的结论是,如果IN后接大数据量的String,要慎重。

在项目中我把mac作为唯一标识建立与id的对应表,在A表使用mac_id代替mac,查询的时候使用IN(1,2,3...)。效率会提高一些。当前使用NoSQL也是一种方式。

总结

到此这篇关于一次Mysql使用IN大数据量优化的文章就介绍到这了,更多相关Mysql使用IN大数据量优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL视图原理与基本操作示例

    MySQL视图原理与基本操作示例

    这篇文章主要介绍了MySQL视图原理与基本操作,简单描述了mysql视图的概念、功能并结合实例形式分析了mysql视图的创建、查询、修改、删除等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • MySQL数据库基于sysbench实现OLTP基准测试

    MySQL数据库基于sysbench实现OLTP基准测试

    这篇文章主要介绍了MySQL数据库基于sysbench实现OLTP基准测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • MySQL中对表连接查询的简单优化教程

    MySQL中对表连接查询的简单优化教程

    这篇文章主要介绍了MySQL中对表连接查询的简单优化教程,表连接查询是MySQL最常用到的基本操作之一,因而其的优化也非常值得注意,需要的朋友可以参考下
    2015-12-12
  • mysql数据库太大了如何备份与还原

    mysql数据库太大了如何备份与还原

    今天小编就为大家分享一篇关于mysql数据库太大了如何备份与还原,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • mysql 8.0.12 安装配置方法图文教程(windows10)

    mysql 8.0.12 安装配置方法图文教程(windows10)

    这篇文章主要为大家详细介绍了windows10下mysql 8.0.12 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 一文带你了解如何用MySQL通配符实现过滤功能

    一文带你了解如何用MySQL通配符实现过滤功能

    本文章将介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤,感兴趣的小伙伴跟着小编一起来学习吧
    2023-07-07
  • MySQL使用SHOW PROCESSLIST的实现

    MySQL使用SHOW PROCESSLIST的实现

    本文主要介绍了MySQL使用SHOW PROCESSLIST的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • 连接MySQL时出现1449与1045异常解决办法

    连接MySQL时出现1449与1045异常解决办法

    这篇文章主要介绍了连接MySQL时出现1449与1045异常解决办法的相关资料,通过IP链接MySQL的时候会出现1499与1054错误异常的情况,这里提供解决办法,需要的朋友可以参考下
    2017-09-09
  • 如何测试mysql触发器和存储过程

    如何测试mysql触发器和存储过程

    本文将详细介绍怎样mysql触发器和存储过程,需要了解的朋友可以详细参考下
    2012-11-11
  • MySQL子查询中order by不生效问题的解决方法

    MySQL子查询中order by不生效问题的解决方法

    ORDER BY 语句用于根据指定的列对结果集进行排序,在日常工作中经常会用到,这篇文章主要给大家介绍了关于MySQL子查询中order by不生效问题的解决方法,需要的朋友可以参考下
    2021-07-07

最新评论