sql中in的意思 解析sql中in关键字的含义

说实话,IN如果经常使用的话还是挺省心的,但是它的背后隐藏着很多弊端。
刚开始接触SQL的时候,我完全是傻傻的用它,但是后来入坑之后才知道了其中的来龙去脉。

记得有一次,我在做项目的时候,想要查看某个部门的所有员工。
我刚刚写了 IN('IT', 'HR', 'Finance')。
结果随着数据量的增加,速度就慢得像乌龟了。
查了半天,发现IN括号里填了几百个部门名称,数据库直接跳过索引,扫描全表。
我当时很困惑。
数据表中没有提到这一点。

也就是说IN最实用的地方就是代替不能写的OR。
例如,查询三个城市的订单,写IN('北京','上海','广州')比写OR条件要容易得多。
我有一个老同事就喜欢用这个招数。
他说代码看起来很新鲜并且易于维护。
但后来他们转向了Java,谁不再关心这些SQL细节了。

我在子查询方面经验很少,但我记得有一个案例,我正在检查某个月度活跃用户。
IN 有一个子查询 SELECT user_id FROM messages,其中 IN 包含“2 02 3 -01 -01 ”和“2 02 3 -01 -3 1 ”之间的日期。
当时觉得挺高级的,但是看执行计划的时候EXPLAIN显示了全表扫描子查询,直接打电话给DBA询问。
后来使用 JOIN 解决了​​这个问题。

当涉及到长列表时,我是最严重的罪犯。
需要一份报告来检查过去三年的所有产品。
IN加载了3 000个ID,查询卡住了。
最终我还是要努力学习临时表。
首先创建一个temp_products(id INT),然后插入其中,最后加入查询。
虽然有点麻烦,但至少我摆脱了困境。
不过有朋友建议我直接批量查看,比如每次1 000个ID,用UNION ALL组合起来,性能会更好。
我以前没有尝试过这个,但听起来很有趣。

我对EXISTS接触很少,但我知道它适合“存在判断”。
有一道SQL面试题是关于使用EXISTS检查用户是否有购买记录。
当时就想过用IN,但是面试官很疑惑。
看来这东西需要根据场景来使用。

索引非常重要。
我有一个表 class_list。
如果年份和班级列没有索引,并且我使用 IN 检查 2 02 3 年的班级,性能将会下降。
后来加了索引,马上就开始查询了。
但是,请记住,如果 IN 列表太长,索引的有效性将会受到影响。
技术论坛上有人讨论说,当IN值超过1 000时,MySQL优化器不会使用索引。

最后,IN是个好东西,但你得会用。
小的对于列表,就继续,对于更长的列表,你必须考虑一下。
临时表、连接都存在,您只需要知道何时使用它们即可。
最重要的是,不要只专注于编写 SQL,您应该了解一些数据库原理、为什么索引很重要以及优化器如何工作。
这项工作相当枯燥,但是一旦你真正理解了它,编写 SQL 就变得令人兴奋。

MySQL表中使用IN命令优化索引提高查询效率mysql中in命中索引

嘿兄弟,你问我如何使用 IN 命令来优化 MySQL 中的索引?我不得不说,我确实有这方面的经验。

记得有一次我负责一个数据量很大的项目。
有一个名为“Orders”的表,其中包含数百万条记录。
要求是验证特定用户下的订单。
订单号必须在几个特定值之内。
当时没注意优化,直接写了一个SELECT FROMorders WHERE order_id IN (1 01 , 1 02 , 1 03 )。
这导致查询速度极慢,服务器挂掉。

后来仔细研究了一下,发现如果在order_id上创建索引的话,查询速度可以大大提高。
所以我重写了SQL语句并创建了一条ALTER TABLE Orders ADD INDEX idx_order_id(order_id);额外。
然后运行原始查询。
哇,立刻就快多了。

另一个例子:我曾经遇到过一个更复杂的查询。
该查询是针对User表中的ID和Orders表中的User ID相同的记录,同时还需要检查Orders表中的Product ID是否在1 01 或1 02 这两个值之间。
我当时写的方式是:子查询和多表连接。
后来我优化了一下,在orders表的user id上创建了索引,然后写成:
SELECT FROMorders WHERE user_id IN (SELECT id FROM users WHERE Product_id IN (1 01 , 1 02 )) USE INDEX(idx_user_id);
这样查询速度就大大提高了。

总的来说,IN命令配合索引使用得当,可以大大提高MySQL查询的效率。
不过也需要注意的是,使用IN时,列表中的值越多,查询效率可能越低,因为MySQL要检查每个值是否匹配。
因此,如果列表包含很多值,可以使用临时表或子查询等其他方法来优化查询。
我从来没有接触过这方面的东西,所以不敢乱说,但是总的来说这些都是提高查询效率的好方法。