在项目中,有一个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递归tree查询效率-mysql递归tree,提供两种递归算法
主要介绍了MySQL中使用or、in与union all在查询命令下的效率对比,论证了在通常情况下union all并不一定比or及in更快,需要的朋友可以参考下
sql查询优化 提高MySQL数据库查询效率的几个技巧
本文介绍主要介绍在mysql中使用in语句时,查询效率非常慢,这里分享下我的解决方法,供朋友们参考。
如何查询mysql中执行效率低的sql语句.pdf
如何查出效率低的语句?在MySQL下,在启动参数中设置 –log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的...
mysql多表查询和EXISTS查询性能对比
char和varchar在mysql中的效率怎样.docx
Mysql 时间模糊查询,不同场景的查询方式,根据条件查询
如何查询mysql中执行效率低的sql语句[借鉴].pdf
比较集中mysql批量更新的方式,推荐一种效率最高的更新语句写法
提升MYSQL查询效率的10个SQL语句优化技巧
主要介绍了MySql通过ip地址进行访问的方法,首先要登录mysql,切换数据库然后授权,具体代码详情大家参考下本
在生产环境中,经常会有这样的场景:获得中文数据。那问题来了,怎么才能匹配出中文字符呢? 本文提供两种方法。 二 演示 2.1 环境 mysql> SHOW VARIABLES LIKE "%version%"; + ——————...
通常来说C++操作MySQL的时候,往Mysql中插入10000条简单数据,速度非常缓慢,居然要5分钟左右, 而打开事务的话,一秒不到就搞定了! 具体实现代码如下: #include #include #include #include "mysql.h" #...
因为mysql本身不能提供毫秒级别的时间,google了一个mysql的能提供毫秒的时间函数,再做测试,做了一个定位。发现是其中一条语句,语句是这个样子: select .... from A, B where .....and A.id in (select id ...
今天看到一篇关于MySQL的IN子查询优化的案例, 一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试。) 随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子...
在MySQL 入门教程中,我们能够看到很多关于如何创建储存过程 和如何利用 IN 和 OUT 参数调用存储过程的示例。这些示例都很简单,能够很好的帮助你理解 MySQL 中创建带参数存储过程的语法。这些示例已在 MySQL 5.5 中...
mysql 树形结构查询,使用存储过程,实现mysql的树形结构查询