MySQL-SELECT WHERE字段IN(子查询)-为什么极慢?
|
我要检查的数据库中有几个重复项,因此,为了查看哪些重复项,我执行了以下操作:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
这样,我将获得与related_field一起出现的所有行不止一次。该查询需要毫秒来执行。
现在,我想检查每个重复项,因此我想可以在上述查询中选择带有some_table的每一行以及一个related_field,因此我做到了:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
由于某种原因,这实际上是缓慢的(需要几分钟)。到底是什么使它变慢了? related_field已建立索引。
最终,我尝试从第一个查询(SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
创建一个视图\“ temp_view \”,然后像这样进行第二个查询:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
而且效果很好。 MySQL在几毫秒内完成了此操作。
这里的任何SQL专家都可以解释发生了什么情况?
没有找到相关结果
已邀请:
10 个回复
豪抱怒掳
我认为ѭ5select必须在选择中,因为否则
子句会给出错误,但我不确定100% 切勿在子查询中使用ѭ7。众所周知,这很慢。 只能将
与固定值列表一起使用。 更多提示 如果您想更快地进行查询, 不选择
您真正需要的字段。 确保在
上有一个索引以加快等参连接的速度。 确保在主键上ѭ11。 如果您在InnoDB上并且仅选择索引字段(并且事情不太复杂),那么MySQL将仅使用索引来解决您的查询,从而加快了工作速度。 90%的“ 12”查询通用解决方案 使用此代码
翁茄口霉氖
最终查询如下所示:
穗揣
末钉蹈泰唬
我已经在一个数据库中尝试了您的查询,还尝试将其重写为对子查询的联接。 这样做的速度更快,请尝试一下!
贸会
骨酚柯
在查询和子查询中都使用表时,应始终对两者都使用别名,如下所示:
有帮助吗?
坊岔埠绵
但要注意:在大多数情况下,mysql优化器运行良好,因此,我建议仅在遇到此类问题时才使用它
渐首洽陈染
济畦刨
的表。我需要的是 寻找在
中具有
且具有
并且也具有
作为
的记录 我需要从
获取所有记录,这些记录的account_code与步骤1相同,但在步骤1结果中有
使用
时,我的查询运行极其缓慢,有时导致请求超时或使我的应用程序没有响应... 我尝试这种组合和结果...还不错...
辩谷变充
*将您要检查的值的名称替换为表中存在的related_field *用比较表上主键列的名称替换primaryKey。