Mysql 如何将IN条件转换为内部联接条件-联接速度较慢
我有一个查询,它在内部连接条件下非常慢,但在WHERE in子句中使用时速度更快: 较慢的内部联接: 选择* 从案例 左连接 选择tst.team\u set\u id 来自团队\u集合\u团队tst 内部加入团队成员资格团队成员资格 在tst上。团队id=团队成员资格。团队id 和团队成员身份。用户id='1' 和团队成员身份。已删除=0组(按tst.team\u集\u id) 个案 关于cases\u tf.team\u set\u id=cases.team\u set\u id 左连接触点(U案例) 在联系人上\u cases.case\u id=cases.id 和联系人_cases.deleted=0 其中cases.deleted=0 按案例排序。名称限制为0,20; 在以下位置更快: 挑选* 从案例 左连接触点(U案例) 在联系人上\u cases.case\u id=cases.id 和联系人_cases.deleted=0 其中cases.deleted=0 和cases.team_set_id in 选择tst.team\u set\u id 来自团队\u集合\u团队tst 内部加入团队成员资格团队成员资格 在tst上。团队id=团队成员资格。团队id 和团队成员身份。用户id='1' 和团队成员身份。已删除=0 按tst.team\u set\u id分组 按案例排序。名称限制为0,20; 内部连接的解释计划和WHERE IN条款如下: 内部联接: 虽然有索引,但我不知道问题出在哪里。请帮帮我。谢谢Mysql 如何将IN条件转换为内部联接条件-联接速度较慢,mysql,performance,join,sugarcrm,Mysql,Performance,Join,Sugarcrm,我有一个查询,它在内部连接条件下非常慢,但在WHERE in子句中使用时速度更快: 较慢的内部联接: 选择* 从案例 左连接 选择tst.team\u set\u id 来自团队\u集合\u团队tst 内部加入团队成员资格团队成员资格 在tst上。团队id=团队成员资格。团队id 和团队成员身份。用户id='1' 和团队成员身份。已删除=0组(按tst.team\u集\u id) 个案 关于cases\u tf.team\u set\u id=cases.team\u set\u id 左连接触
这是sugarcrm中的一个查询无法在条件中转换为内部联接。 具有IN条件的查询称为半联接。 半联接返回一个表中与另一个表联接但不执行完全联接的行。 下面是使用IN运算符的半联接查询的简单示例:
SELECT *
FROM table1
WHERE some-column IN (
SELECT some-other-column
FROM table2
WHERE some-conditions
)
上述半连接可以转换为语义等价的查询
等价-表示给出完全相同的结果
使用EXISTS运算符和从属子查询:
SELECT *
FROM table1
WHERE EXISTS(
SELECT 1
FROM table2
WHERE some-conditions
AND table1.some-column = table2.some-other-column
)
大多数领先的数据库对上述两个查询使用相同的计划,并且它们的速度相同,
不幸的是,MySql并不总是如此
连接和半连接是完全不同的查询,具有完全不同的执行计划,因此比较它们的速度就像比较苹果和洋葱。
您可以尝试将IN的第一个查询转换为EXIST的查询,但不能转换为join。谢谢,但我们最终完全删除了团队条件。
SELECT *
FROM table1
WHERE some-column IN (
SELECT some-other-column
FROM table2
WHERE some-conditions
)
SELECT *
FROM table1
WHERE EXISTS(
SELECT 1
FROM table2
WHERE some-conditions
AND table1.some-column = table2.some-other-column
)