Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何将IN条件转换为内部联接条件-联接速度较慢_Mysql_Performance_Join_Sugarcrm - Fatal编程技术网

Mysql 如何将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 左连接触

我有一个查询,它在内部连接条件下非常慢,但在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条款如下:

内部联接:

虽然有索引,但我不知道问题出在哪里。请帮帮我。谢谢
这是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
)