`

MySql中in查询效率低的替代方法

 
阅读更多

在项目中,有一个in查询效率很低,耗时大概10多秒,修改后为1秒左右,本来想造一组数据展现效果的,发现实际情况比较复杂,跟具体的关联数据类型、列是否有索引等相关,实际情况并不是某种查询就肯定比另一种查询效率高。在此不再费心思造数据,仅列出几种可能的查询方法,以备需要时尝试。

 

1. in查询实现

select * from product 

where id in (select rela_id from product_rela where id = '1');

 

2. 给in查询包一层temp

select * from product 

where id in (select rela_id from (select rela_id from product_rela where id = '1') as temp);

 

这种方法与普通的in查询相比,只是给in的子查询包装了一层select xxx from( ... )as temp,看似没做什么,但我在项目中通过此方法确实提高了查询效率,具体原理有待进一步考证。

 

3. 使用exists查询代替in查询

select * from product a 

where EXISTS (select rela_id from product_rela b where a.id=b.rela_id and b.id = '1'); 

 

4. 将in查询改为连接查询

select * from product a 

INNER JOIN product_rela b 

on a.id= b.rela_id and b.id='1';

 

 

mysql中 并不是exists一定比in效率快

一、关于exists和in的效率问题: 

分场景:

 

1.此场景适应A表数据量大于B表,且where后的字段加了索引。这种情况用in效率高的原因是利用了大表的索引。

  select * from ecs_goods A where A.cat_id in(select cat_id from ecs_category B);

  -------------------------------------------------------------------------------

2.此场景适应B表数据量大于A表,且where后的字段加了索引。这种情况用exists效率高的原因是利用了大表的索引。

  select * from ecs_goods a where EXISTS(select cat_id from

    ecs_category b where a.cat_id = b.cat_id);

 

总结:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

 

 

分享到:
评论

相关推荐

    mysql in语句子查询效率慢的优化技巧示例

    MySQL中的`IN`子查询在某些情况下可能会导致查询效率低下,特别是当子查询返回大量数据或者与外部表进行全表扫描时。本篇文章将探讨这个问题,并提供一些优化`IN`子查询的策略。 首先,问题出现在查询文章列表时,...

    浅谈mysql的子查询联合与in的效率

    总之,理解MySQL中的子查询和`IN`操作符的工作原理,并结合实际场景进行性能测试,是提升数据库效率的关键。开发者应时刻关注查询性能,适时调整查询结构,以适应高并发和大数据量的业务需求。同时,保持对数据库...

    MySQL海量数据查询优化策略.

    10. 使用EXISTS代替IN:在子查询中使用EXISTS通常比使用IN执行更快,尤其是在大表和小表的关联查询中,因为EXISTS在找到第一个匹配项后即停止搜索。 11. 使用表的别名:在复杂查询中使用表的别名可以提高代码的...

    sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

    SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的...通过使用EXISTS和NOT EXISTS,我们可以提高查询的效率,避免了使用NOT IN和IN的低效率。同时,EXISTS和NOT EXISTS也可以使查询语句变得更加简洁和易于理解。

    25.6 MySQL 子查询

    MySQL 子查询是一种在SQL查询语句中嵌套其他查询的方法,它允许我们在一个查询中使用另一个查询的结果。子查询可以作为SELECT语句的一部分,也可以出现在FROM或WHERE子句中,甚至可以在HAVING子句中使用。它们为...

    Mysql子查询IN中使用LIMIT应用示例

    但是,MySQL并不支持在`IN`、`ALL`、`ANY`或`SOME`子查询中直接使用`LIMIT`,导致了错误。 为了解决这个问题,开发者采取了另一种策略,即创建一个临时子查询来获取所需的`aid`值: ```sql WHERE mapply.aid IN ...

    MySQL基础教程之IN的用法详解

    MySQL中的`IN`运算符是SQL查询语言中的一个重要组成部分,主要用于在`WHERE`子句中指定多个可能的值,以便从数据库中筛选满足条件的记录。本教程将深入探讨`IN`的用法,包括基本语法、使用实例、子查询以及性能考虑...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    查询数据是指从数据库中的数据表或视图中获取所需要的数据,在mysql中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy ...

    详解Mysql多表联合查询效率分析及优化

    MySQL中的多表联合查询是数据库操作中常见的需求,特别是在处理复杂的数据分析和报表时。本文将深入探讨多表联合查询的效率分析以及优化策略。 首先,我们要了解多表连接的几种基本类型: 1. **笛卡尔积(Cross ...

    mysql性能的优化

    - **index_subquery**:替代某些IN子查询的优化方法,适用于非唯一索引。 - **range**:检索给定范围内的行。 - **index**:仅扫描索引树。 - **ALL**:对每个前面表的行组合,进行全面的表扫描。 - **possible...

    30种mysql优化sql语句查询的方法.docx

    以下是对标题“30种mysql优化sql语句查询的方法.docx”中提及的一些关键优化策略的详细解释: 1. **避免全表扫描**:全表扫描意味着数据库必须遍历整个表来寻找匹配的数据,这是低效的。应尽量在`WHERE`和`ORDER BY...

    mysql优化_提高百万条数据的查询速度

    5. **慎用 IN 和 NOT IN**:对于连续数值,使用 BETWEEN 操作符替代 IN,可以提高效率。对于大范围的 IN 查询,可能会导致全表扫描。 6. **避免 LIKE %...%**:模糊匹配操作可能导致全表扫描。如果需要模糊搜索,...

    释放MySQL性能:优化查询的艺术

    本文全面深入地探讨了MySQL查询性能优化的各种方法,包括索引的使用、查询语句优化、查询重写以及服务器和硬件配置等方面。通过具体的代码示例和策略建议,希望能够帮助读者更好地理解和实施MySQL查询优化,从而提升...

    基于MySQL的查询优化技术.pdf

    同样,对于子查询中的`IN`子查询,如果扫描全表会导致性能下降,可以考虑改写查询,如使用`JOIN`操作来替代,以利用索引提高性能。 总的来说,MySQL的查询优化主要包括合理设计和使用索引,避免全表扫描,优化查询...

    MySQL5.56.zip

    4. 查询优化器改进:MySQL5.5的查询优化器进行了升级,能够更准确地评估查询计划,提高查询速度。 5. FederatedX存储引擎:支持跨服务器的数据访问,允许用户将多个MySQL服务器视为单一数据库。 6. 分区功能增强:...

    MySQL中表子查询与关联子查询的基础学习教程

    MySQL中的表子查询和关联子查询是SQL查询中两种重要的技术,它们在处理复杂的数据查询时发挥着关键作用。本文将深入探讨这两种子查询的概念、用法和优化策略。 首先,我们来看表子查询。表子查询指的是在一个查询中...

    mysql百万量级优化

    本文将围绕“MySQL百万量级优化”这一主题,深入探讨在实际应用过程中提升MySQL性能的关键方法和技术细节。 #### 二、查询优化技巧 1. **避免全表扫描** - **建立索引**:在`WHERE`及`ORDER BY`涉及的列上建立索引...

    30种mysql优化sql语句查询的方法.pdf

    16. **使用覆盖索引**:如果查询只需要索引中的数据,覆盖索引可以避免回表,提高效率。 17. **减少JOIN操作**:尽可能减少JOIN操作,尤其是大表间的JOIN,优化JOIN条件以利用索引。 18. **合理使用GROUP BY和...

    MYSQL-Front(mysql数据库管理工具)

    这款工具使数据库管理和维护变得更加简单,尤其对于那些不熟悉命令行界面的用户来说,MySQL-Front提供了一个图形化的替代方案。 首先,MySQL-Front支持多种数据库操作,包括创建、修改和删除数据库、表、视图以及...

    MYSQL读书笔记整理

    - **子查询优化**:使用EXISTS替代IN,因为 EXISTS 在大多数情况下更快,尤其是在子查询结果集大的时候。 - **避免SELECT ***:只选择需要的列,可以减少数据传输量,提高查询速度。 - **使用LIMIT优化分页查询**...

Global site tag (gtag.js) - Google Analytics