栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

内部连接选择A和B上的(A,B)与MySQL中的select(A,B)中的(A,B)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

内部连接选择A和B上的(A,B)与MySQL中的select(A,B)中的(A,B)

要回答这个问题并不容易。您应该知道一件事:MySQL将

IN (<static values list>)
IN(<subquery>)
视为不同的查询。第一个等于 范围比较 (如
.. OR = .. OR =
),而第二个等于
= ANY()
-,并且不相同。因此,简而言之:
IN
与subquery一起使用将导致with查询,
ANY()
而MySQL不会为此使用index,即使subquery是独立的并返回
静态值列表 。伤心,但真实。MySQL无法预测到这一点,因此即使显而易见,也不会使用索引。如果使用
JOIN
(即重写
IN(<subquery>)
),则MySQL将使用index作为
JOIN
条件(如果可能)。

现在,第二种情况可能

JOIN
IN
使用分区有关。如果您将使用
JOIN
-那么,可悲的是-但MySQL
JOIN
在通常情况下也无法预测分区-
它将使用整个分区集。替换
JOIN
IN (<static list>)
会改变
EXPLAINPARTITION
情况:MySQL将仅使用那些在
IN
子句中指定的从范围中选择值所需的分区。但是,这再次不适用于
IN (<subquery>)

得出一个结论-令人遗憾的是,当我们谈论MySQL如何处理

IN
子查询时-
在通常情况下,不能
JOIN
安全地替换它(这是关于分区的情况)。因此,常见的解决方案是: 在应用程序级别将子查询与主查询分开
。如果我们说的是独立子查询,返回静态值列表,那是最好的建议-那么您可以将该值列表替换为as
IN(<staticlist>)
并获得好处:MySQL将为其使用索引,并且,如果我们说的是分区,则实际上从他们需要的将被使用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/568205.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号