mysql 中 in/exists/not in/not exists/or的使用场景和效率对比


mysql 中 in/exists/not in/not exists/or的使用场景和效率对比
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
网上一堆博客在讨论mysql里面内置的关键字的效率问题,绝大部分都脱离了一定的前提条件就展开了论述,这是不科学的。
首先我们必须确定在mysql的哪个版本当中来讨论。这一点是因为mysql是在不断的快速更新当中的,大家都知道5.6的版本和之前的版本之间质的飞跃可以说是
里程碑式的。当然硬件环境也要保持一致。存储引擎也必须一致。该使用索引的地方使用索引,联合索引用的适当效率会很高,覆盖索引。

以下都是以InnoDB作为存储引擎做比较的。

讨论in VS or
在当前版本中(5.6.x),
   1 数据量较小的情况下,效率相差无几。
   2 数据量较大的时候,in 效率平稳降低,or 急剧降低。
     请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
讨论in VS exists
in 与exists的本质: in 是两张变的hash连接,exists是外层变loop循环,每次循环操作内层表。
在当前版本中(5.6.x),
   1 当数据量较小的时候,使用任何一种效率都不受影响。
   2 当数据量较大的时候 分为两种情况
     1) 子查询的结果集较小,这时候使用in的效率比较好
2) 子查询的结果集较大,这时候使用exists效率好。
     3)能用between的地方就不要用in
讨论not in VS not exists
在当前版本中(5.6.x),
  not exists 的效率始终比not in 要好。
  可以用distinct就不要用group by
    请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
  注意mysql的版本,可能等下一个大版本更新的时候,一切都可能会改变。
 
  分页的时候 尽量如此优化
  select * from page where id between 1000000 and 1000010;

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MySQLexists和not exists是用于判断子查询是否存在数据的关键字。 exists表示子查询存在数据时返回true,否则返回false。 not exists表示子查询不存在数据时返回true,否则返回false。 例如: SELECT * FROM table1 WHERE EXISTS (SELECT * FROM table2 WHERE table1.id = table2.id); 上述语句表示如果table2存在与table1id相同的数据,则返回table1所有数据。 SELECT * FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.id = table2.id); 上述语句表示如果table2不存在与table1id相同的数据,则返回table1所有数据。 ### 回答2: MySQL的"EXISTS"和"NOT EXISTS"是用于检查子查询返回的结果是否为空。具体来说,"EXISTS"用于判断子查询的结果集是否存在,如果存在则返回"true",否则返回"false";"NOT EXISTS"则刚好相反,如果子查询的结果集不存在,则返回"true",否则返回"false"。 例如,我们有两个表:"orders"和"customers"。我们想要找出已经下过订单的顾客,可以使用"EXISTS"关键字来实现: ``` SELECT * FROM customers c WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id ); ``` 上述查询语句,首先从"customers"表选择所有的顾客记录,并在WHERE子句使用一个子查询来判断是否存在该顾客的订单记录。如果存在,则返回该顾客记录。 相反地,如果我们想要找出没有下过订单的顾客,则可以使用"NOT EXISTS"关键字: ``` SELECT * FROM customers c WHERE NOT EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id ); ``` 上述查询语句使用"NOT EXISTS"来判断不存在顾客的订单记录,如果不存在,则返回该顾客记录。 总结来说,通过使用"EXISTS"和"NOT EXISTS"可以方便地检查子查询的结果是否为空,从而实现我们所需的条件判断。在实际应用,这些关键字可以用于复杂的查询条件,帮助我们过滤和筛选数据。 ### 回答3: MySQLEXISTS和NOT EXISTS是两个用于子查询的谓词。它们用于判断一个子查询是否返回数据,并根据返回结果进行条件判断。 EXISTS谓词用于判断一个子查询是否返回任何结果。如果子查询返回了至少一条数据,则表达式返回TRUE;否则返回FALSE。我们可以使用EXISTS来进行关联查询,判断某个条件是否存在。 举个例子,我们可以使用EXISTS来判断是否有学生通过考试: ``` SELECT name, score FROM students WHERE EXISTS ( SELECT * FROM exam_results WHERE students.id = exam_results.student_id AND exam_results.score >= 60 ) ``` 上面的查询会返回通过考试的学生的姓名和分数。 NOT EXISTS则与EXISTS相反,用于判断子查询是否没有返回任何结果。如果子查询没有返回数据,则表达式返回TRUE;否则返回FALSE。我们可以使用NOT EXISTS来查询不存在某个条件的数据。 举个例子,我们可以使用NOT EXISTS来查询没有购买过商品的顾客: ``` SELECT name, address FROM customers WHERE NOT EXISTS ( SELECT * FROM orders WHERE customers.id = orders.customer_id ) ``` 上面的查询会返回没有购买过商品的顾客的姓名和地址。 总之,MySQLEXISTS用于判断子查询是否存在结果,而NOT EXISTS则用于判断子查询是否不存在结果。我们可以利用这两个谓词来进行更复杂的条件查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

annan211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值