首页 > 数据库 >mysql的IN查询优化

mysql的IN查询优化

时间:2023-06-23 12:56:34浏览次数:51  
标签:JOIN mysql 查询 字段 表名 id 优化 order SELECT

mysql的IN里面的数量太大,比如大于1千时,查询的性能就会差很多。
有以下的解决方法。

解决方法一:拆分IN的数量

IN 数量超过1千,就拆成多条 sql, 每条sql的IN数量不超过1千。

用OR或者UNION进行SQL改写。

也可以使用 Java写代码,把 IN 数量进行拆分,每条sql的IN数量不超过1千。多次执行。

比如使用 IN 的sql 是

SELECT 字段1 FROM 表名 WHERE 字段2 IN (1,2,3,4,5,...2000)

可以替换成:

SELECT 字段1 FROM 表名 WHERE 字段2 IN (1,2,3,4,5,...1000) 
UNION ALL 
SELECT 字段1 FROM 表名 WHERE 字段2 IN (1001,1002,...2000)

这个方法有个缺点,就是如果 IN 里面的数量太大,比如1万,那么就需要拼接10次。。

解决方法二 :使用 JOIN(关联查询)来代替 IN

可以给字段加上索引,然后使用 JOIN(关联查询)

比如使用 IN 的sql 是:

SELECT 字段  FROM 表名1
WHERE 字段1 IN (SELECT 字段2 FROM 表名2);

可以用关联查询代替为:

SELECT 字段  FROM 表名1
JOIN 表名2
ON 表名1.字段1=表名2.字段2

解决方法三 :使用临时表

创建临时表,当你断开与数据库的连接后,临时表就会自动被销毁。 临时表只在当前连接中有效。

还可以给字段加上索引。

格式:

CREATE TEMPORARY TABLE 临时表名 (id int auto_increment primary key ,
                                            字段名 VARCHAR(长度),
                                          INDEX idx_索引名 (字段名));

然后将表的数据,插入到临时表,格式如下:

INSERT INTO 临时表名(字段名) SELECT 字段 FROM 表名;

然后,再使用OR 或者 JOIN 关联查询。

示例:

CREATE TEMPORARY TABLE temp_table_order (id int auto_increment primary key ,
                                            order_id VARCHAR(32),
                                          INDEX idx_order_id (order_id));
           
INSERT INTO temp_table_order(order_id) SELECT order_id FROM tb_order_detail_test;
           
SELECT *  FROM tb_order_test tb
JOIN temp_table_order tt
ON tb.id=tt.order_id;

如果是比较重要的数据,也可以使用普通的表,持久保存。

参考资料:

https://www.zhihu.com/question/578354887/answer/2846786420

标签:JOIN,mysql,查询,字段,表名,id,优化,order,SELECT
From: https://www.cnblogs.com/expiator/p/17499007.html

相关文章

  • Mysql存储引擎
    原文链接:https://blog.csdn.net/lzb348110175/article/details/106555504本文目录:1.MySQL体系结构2.存储引擎介绍3.MySQL存储引擎特性4.MySQL有哪些存储引擎5.了解MySQL数据存储方式6.MySQL存储引擎介绍6.1CSV存储引擎6.1.1CSV介绍6.1.2使用CSV存储引擎......
  • mysql的数据类型以及mysql中的int11是什么意思
    今天抽时间来讲一下mysql里的知识点,之前有不少人问过我,mysql中的int(11),这个11到底是啥意思?是11位的意思吗?你是否也想过这个问题,是否也有这个疑问?ok,今天就展开来讲一下,用通俗易懂的大白话来给你彻底搞明白一、跟你扯点二进制的小东西要讲清楚这个问题,我先来给大家科普一点计算......
  • MySQL事务四大隔离级别分析
    什么是事务?事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务的四大特性原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行。一致性:指在事务开始之前和事务结束以后,数据不会被破坏,......
  • RestClient查询【ElasticSearch】
    packagecn.itcast.hotel;importcn.itcast.hotel.pojo.HotelDoc;importcom.alibaba.fastjson.JSON;importorg.apache.http.HttpHost;importorg.elasticsearch.action.search.SearchRequest;importorg.elasticsearch.action.search.SearchResponse;importorg.elas......
  • match_all 查询所有【ElasticSearch】
    /***match_all查询所有*/@Testpublicvoidtest02()throwsIOException{SearchRequestsearchRequest=newSearchRequest("hotel");SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();......
  • rang 范围查询【ElasticSearch】
    /***rang范围查询*/@Testpublicvoidtest04()throwsIOException{SearchRequestsearchRequest=newSearchRequest();SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();searchSourceBuilder......
  • term 精确查询【ElasticSearch】
    /***term精确查询*/@Testpublicvoidtest03()throwsIOException{SearchRequestsearchRequest=newSearchRequest();SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();searchSourceBuilder.......
  • 搜索引擎如何优化
    1、了解搜索引擎如何抓取网页和如何索引网页。2、Meta标签优化。3、如何选取关键词并在网页中放置关键词。4、了解主要的搜索引擎。5、主要的互联网目录6、按点击付费的搜索引擎。7、搜索引擎登录。8、链接交换和链接广泛度(LinkPopularity)。9、标签的合理使用:标签的语义......
  • 大数据处理新-分布式算法与优化
    本书介绍    计算机是一种机器,可以被指示执行一系列算术或逻辑运算,以执行特定的任务,如解决特定的问题。计算机程序是计算机执行的指令的集合。一个程序解决一个特定问题的基本方法被称为算法,这个问题可以由一系列定义明确、可由计算机实现的指令来确定。因此,算法可以被看作是一......
  • match查询【ElasticSearch】
    /***match分词再查询*/@Testpublicvoidtest01()throwsIOException{//todo2.搜索条件封装SearchRequestsearchRequest=newSearchRequest("hotel");//todo4.所有搜索条件封装到searchSourceBuilder对象S......