SQL,查询条件中IN的内容过多效率低进行优化

这篇具有很好参考价值的文章主要介绍了SQL,查询条件中IN的内容过多效率低进行优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前提:

        业务实施过程中,查询分页数据很慢,后定位到是in的数据过多,导致查询很慢。

优化思路:

        使用临时表解决,将数据插入到一临时表中,再将临时表与查询主表进行join。

其中要注意的是,因为业务部署使用的是分布式部署,有多个节点,要保证每个临时表在多个节点下也是唯一的。这里采用的方式是使用节点ip+port+IdUtil.objectId()【也可以使用雪花参数,但还是要加上IP与端口才能保持唯一】

示例:

        原SQL(当数组ids的数值过多时,查询效率很慢)

        select
        count(*)
        from t_test_info info
        <where>
            info.status = 0 
            <if test="ids!= null and ids.size > 0 ">
                AND info.id in
                <foreach collection="ids" separator="," open="(" close=")" item="id">
                    #{id}
                </foreach>
            </if>
        </where>

      优化SQL

1、新建临时表xml, 包含创建临时表、临时表新增数据、drop临时表

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.TemporaryTableMapper">

    <update id="createPtIdTempTable">
        drop temporary table if exists ${tableName};
        create temporary table ${tableName}
        (
            pt_id bigint not null
        )
    </update>

    <insert id="batchInsertPtIdTempTableData">
        insert into ${tableName} (id)
        values
        <foreach collection="list" item="item" separator=",">
            (#{item})
        </foreach>
    </insert>

    <delete id="dropTempTable">
        drop temporary table if exists ${tableName};
    </delete>
</mapper>

2、代码优化

    //新建临时表
 String tempTableName = "t_temp_" +HttpUtil.getIpPort()+ IdUtil.objectId();
        temporaryTableMapper.createPtIdTempTable(tempTableName);
        temporaryTableMapper.batchInsertPtIdTempTableData(queryDto.getPtIds(), tempTableName);
    //将临时表名称传入sql

对应sql优化

        select
        count(*)
        from t_test_info info
         join ${tempTableName} temp on info.id = temp.id
        <where>
            info.status = 0 
        </where>

然后再去对列表测试,可以发现查询效率大幅度提升。文章来源地址https://www.toymoban.com/news/detail-668671.html

到了这里,关于SQL,查询条件中IN的内容过多效率低进行优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql对以逗号分隔的字段内容进行查询——find_in_set函数或locate函数或position函数

    使用mysql时,有可能一个字段代表一个集合,如果将这个集合单独抽成一张表又不值当的,这个时候我们存储时,可以选择用逗号将数据分隔开(只能用英文的逗号),如图所示: 做查询时怎么查呢? 假如说给一个数据作为查询条件,判断该字段是否存在,应该怎么查呢?

    2024年01月15日
    浏览(41)
  • ES:多值(in)查询和条件批量删除

    Elasticsearch 查询删除语句 查询结果 查询结果 多值批量查询结果如下 删除语句 删除结果如下

    2024年02月11日
    浏览(41)
  • sql in 条件超过 1000 怎么办?

    使用IN和多个值 - 将条件分成多个小组,并将每个小组作为IN子句中的多个值,以避免单个IN子句中的条件数量过多。例如: SELECT * FROM table_name WHERE column_name IN (value_1, value_2, ..., value_1000) OR column_name IN (value_1001, value_1002, ..., value_2000) OR column_name IN (value_2001, value_2002, ..., value_3

    2024年02月08日
    浏览(37)
  • not in效率低(MYSQL的Not IN、not EXISTS如何优化)

    【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】 【创作不易,点个赞就是对我最大的支持】 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 原SQL使用的是NOT IN 原因分析:我用了两条sql来解决,第一条sql去查了一组id来排

    2024年02月11日
    浏览(37)
  • MySQL Execution Plan -- IN条件与ORDER BY组合优化

    MySQL版本: 5.7.27-30-log Percona Server (GPL), wsrep_31.39 涉及表结构: 涉及SQL: 在系统没有任何压力情况下,该SQL执行时间超过200ms。 查看SQL对应执行计划: 查看满足WHERE条件数据: 通过profiling查看耗时情况: 根据profiling结果可以发现99.9%的耗时在 Creating sort index 环节,查询条件中

    2024年02月14日
    浏览(31)
  • MySql之in查询优化

    1、功能         信息模块用户阅读的统计量 2、sql响应时间         5s左右 3、经过查看,是因为单表数据量过大,且用了mysql的in子查询。所以很慢。 4、优化方式         4.1、连接优化 使用left join on优化,速度确实提升了,但是依旧不太好。以下是in的sql优化代码(部

    2024年02月16日
    浏览(34)
  • MySQL中的in+子查询应该如何优化

    ☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅📅📅面经分享(牛客主页):传送门 🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正! 📜 如果觉得内容还不错,欢迎点赞收藏关注哟!

    2024年01月19日
    浏览(33)
  • MySQL 大数据in查询该怎么优化

    对于 MySQL 中的大数据 IN 查询,可以使用以下方法进行优化: 尽可能使用索引。如果使用 IN 操作符的字段有索引,MySQL 将会使用索引来加速查询。 尽量使用常量作为 IN 操作符中的参数,而不是使用子查询或者表达式。因为 MySQL 在优化器中使用常量比较容易,因此常量可以提

    2024年02月11日
    浏览(32)
  • 如何对MySQL和MariaDB中的查询和表进行优化-提升查询效率

    MySQL和MariaDB是数据库管理系统的流行选择。两者都使用SQL查询语言来输入和查询数据。 尽管SQL查询是简单易学的命令,但并不是所有的查询和数据库函数都具有相同的效率。随着你存储的信息量的增长,如果你的数据库支持一个网站,随着网站的受欢迎程度的增加,这就变得

    2024年02月11日
    浏览(50)
  • SQL 单行子查询 、多行子查询、单行函数、聚合函数 IN 、ANY 、SOME 、ALL

    单行子查询 子查询结果是 一个列一行记录 select a,b,c from table where a (select avg(xx) from table ) 还支持这种写法,这种比较少见 select a,b,c from table where (a ,b)=(select xx,xxx from table where col=‘000’ ) 多行子查询 子查询结果是 一个列多行记录 select a,b,c from table where a [ some | any |

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包