谈谈mysql中in查询的原理

这就是陷阱,避免长长的值列表。

mysql instr条件查询的实现

说实话,当我第一次接触 INSTR 函数时,我根本不理解它并且喜欢它。
我记得有一个项目我想使用。
这时,数据库向导提醒了我一句话:“INSTR寻找位置,LIKE寻找包含,但位置有时比包含更重要。
”这个道理是那么清楚。

比如有一个场景特别有趣。
我们有一个电子商务系统,可以检查备注中包含“紧急”一词以及前 1 0 个字符中包含“紧急”一词的订单。
如果直接用LIKE写LIKE'%.Urgent%'肯定不行,索引打不开。
结果使用INSTR(message,'urgent')BETWEEN 1 AND 1 0,查询速度提升了3 0%。
当时我还在想,MySQL底层是不是使用正则排序规则?查阅资料后,我发现INSTR这个直接查找位置的函数可以更好地利用索引。

我特别记得数据分析师老王的抱怨。
之前他使用 LIKE 'error%' 来检查系统日志,但最终每次都必须扫描整个表。
切换到 INSTR(LOWER(message),'error')>0 后,CPU 使用率下降了 5 0%。
但老王说这话的时候却有些自嘲。
最终,他后来再次将通配符更改为LIKE'error%'。
他说:“INSTR从性能上来说是不错,但是写起来太难了,维护成本也高。
”这是正确的。
虽然 INSTR 性能不错,但这样的细节需要额外的功能,比如管理大小写字母、处理空格等,确实比 LIKE 更麻烦。

在数据清洗领域,INSTR也非常有用。
我们处理了一批客户电子表格,一些公司以字母格式存储他们的电话号码,例如“1 3 8 ABC”。
当时我们想过滤掉所有以1 3 8 开头的号码,只需使用INSTR(phone,'1 3 8 ')=1 即可。
一位实习生坚持要添加通配符,我说:“试试?”结果,请求时间从 2 秒跃升至 2 00 秒。
他说:“师父,我以为 INSTR 也可以使用通配符“%”。
我不知道是该笑还是该哭。
这个函数的本质是它不能是通配符。

但是,INSTR也有明显的缺点。
比如搜索“小明”,不管是小明、小明的同学,还是小明的同学,只要包含小明就可以了。
LIKE可以像“小明”一样准确。
在一个项目中,销售团队想要检查客户的笔记中是否提到了“小明”这个人。
结果,INSTR 发现了许多不相关的记录。
最后我又改回LIKE“小明”。

所以现在使用INSTR我有一个原则:如果你只需要知道它们是否存在或者你需要精确控制位置,INSTR是理想的选择。
但如果你想搜索“小明”这样的关键词,LIKE就更靠谱了。
如今,数据库功能也分为“搜索型”和“内涵型”,而INSTR是内涵型的竞争对手。

MySQL中使用IN查询有什么限制mysql中in有限制吗

需要明确的是,虽然 IN 查询在 MySQL 中很常用,但也有一些限制。
其实很简单。
首先也是最重要的是值列表的长度限制。
MySQL允许的最大值是6 5 5 3 5 或者你可以通过调整max_allowed_pa​​cket变量来放宽这个限制。
还有一点就是比较NULL值有一个问题,所以将NULL与其他值比较会返回NULL,而且即使结果是相同的值也可以排除。
另一个重要的细节是,作为值列表的查询会影响性能。
查询可能会产生额外的计算和内存开销。
起初我以为查询总是很快,但后来我发现事实并非如此。
有时使用 JOIN 或 UNION 更有效。
等等还有一件事。
IN 查询只能定位一列。
如果需要比较多列。
你需要找到另一种方法。
很多人没有意识到这一点。
IN查询不支持范围查询。
如果需要此功能,必须使用BETWEEN或其他方法。
首先评估您的需求并根据这些限制优化您的查询我认为你应该尝试一下。