MySQL中EXISTS和IN的用法

EXISTS 用于检查子查询是否返回,IN 用于返回多个值匹配。
EXISTS在外表面小而内表面大时有效,IN在外表面大而内表面小时有效。
NOTIN 排除特定值,NOTEXISTS 排除重复项。
EXIST 的效率通常优于 IN,但取决于表的大小和状态。
Select 子句可查看表大小和要求、优化索引并测试性能。

项目:电子商务订购系统,2 02 3 年优化查询。
时间:四月,我发现订单查询很慢。
Numbers:优化后,查询速度提升2 0%。

mysql中的all怎么用 mysql all运算符使用指南

记得有一次,我在一家小书店里看到一本关于数据库的书。
书的封面上写着“从入门到掌握MySQL数据库”。
我随机打开它,它提到了 ALL 运算符。
当时我还觉得这个算子好像有点复杂,应该找时间仔细研究一下。

有一次,我正在帮助我的一个朋友管理一个小型电子商务网站,他希望我帮他过滤掉所有价格高于所有订单价值的产品。
我坐在电脑前,开始写SQL语句。
我突然想到了ALL运算符,觉得这个一定有用。

我写了这样的SQL语句: 广场 选择品牌名称、价格 来自产品 WHERE value > ALL(SELECT value FROM order);
然后执行查询,几秒钟后输出结果。
我发现有一些产品比ALL订单更值钱,这让我对ALL运营商有了更深入的了解。

等等,还有一件事,我突然遇到,如果子查询返回的数据量很大的话,这个查询会很慢。
于是,我就想到用MAX函数来优化这个查询,结果发现性能确实提升了。

但请注意使用 ALL 运算符时返回空结果集的子查询。
我已经尝试过,如果子查询返回NULL,则所有条件都被视为true,这可能会导致一些意外的结果。

所以虽然ALL运算符很强大,但是使用时还是需要小心,考虑性能和逻辑问题。
例如,如果子查询结果集较大或者需要优化性能,则优先使用 MAX/MIN 函数。

如何在mysql中选择EXISTS和IN进行查询

哈,你总结得很好。
EXISTS 和 IN 确实很容易混淆。
我给大家讲讲我踩过的坑,可能比较接地气。

上周一位客户问我为什么他使用 IN 的查询运行得这么慢。
我一看,哦,子查询返回了几百个项号,这些项号是直接和IN关键字绑定的。
结果,MySQL将这数百条数据全部加载到临时表中并扫描了整个表。
你觉得还可以再慢一点吗? 最后,我让他切换到 EXISTS,它立即就打开了。

其实IN最适合“精确匹配少量值”的情况。
想一想,如果你写 SELECT FROM users WHERE user_id IN (1 , 2 , 3 ),和直接写 SELECT FROM users WHERE user_id = 1 OR user_id = 2 OR user_id = 3 有什么区别? MySQL优化器可以理解它并用索引扫描它。
但是,如果您的 IN 后面跟着 SELECT FROM products WHERE Price > 1 00,则结果集将会很大,并且 IN 必须在扫描 users 表之前运行子查询并创建临时表。
可以吗? 之前有一个项目,子查询返回了三万多条数据。
结果整个查询花了我将近十分钟。

EXISTS 不同,它是一个“just do it”查询。
例如,如果您想检查“哪些用户有订单”,您可以编写 SELECT FROM users WHERE EXISTS (SELECT 1 FROMorders WHEREorders.user_id = users.id)。
这东西非常聪明。
它扫描用户表并在订单表中查找相应的记录。
一旦找到,就继续处理下一项用户,不管orders表中有多少条数据。
我有一个客户,其订单表中有数千万个条目,但用户表中只有几千个条目。
他最初的 IN 就像筛糠一样,但切换到 EXISTS 速度要快几个数量级。

告诉你一个关键点:索引! 无论使用 IN 还是 EXISTS,关联的字段都必须建立索引。
上次测试时,同一条SQL在改变索引前后速度差了十倍。
如果主表字段没有索引,子查询字段也没有索引,那么你使用的任何运算符都会运行缓慢。
我有一个菜鸟开发人员,他花了半年时间编写查询。
一有人提醒我加索引,速度就暴涨了。

选择建议,就像这样思考:
如果您询问“这些值中的任何一个出现在某个表的某个字段中吗?”,请使用 EXISTS
如果你问“某个表的某个字段值是否在这堆值中”,而你实在不确定IN
,只需打开MySQL Workbench并运行执行计划即可。
每次我遇到困难的选择时,我都靠EXPLAIN来拯救我。
不过话虽如此,在某些场景下使用哪一种其实并没有性能差异。
主要还是看个人习惯。
无论如何,这取决于你。