我想判断一个数据库中的两个副本,所以我做了以下工作来查看哪些是副本:

SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1

这样,我将获得相关_字段多次出现的所有行.执行此查询需要毫秒.

现在,我想判断每一个重复项,所以我想我可以在上面的查询中用一个相关的_字段 Select 某个_表中的每一行,所以我这样做:

SELECT *
FROM some_table 
WHERE relevant_field IN
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
)

由于某种原因(需要几分钟),这个过程变得非常缓慢.到底是什么让它这么慢?相关的_字段被索引.

最后,我try 从第一个查询(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专家吗?

推荐答案

正在为每一行运行子查询,因为它是一个相关查询.通过从子查询中 Select 所有内容,可以将相关查询转换为非相关查询,如下所示:

SELECT * FROM
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
) AS subquery

最后的查询如下所示:

SELECT *
FROM some_table
WHERE relevant_field IN
(
    SELECT * FROM
    (
        SELECT relevant_field
        FROM some_table
        GROUP BY relevant_field
        HAVING COUNT(*) > 1
    ) AS subquery
)

Mysql相关问答推荐

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

数组上的MySQL、JSON_CONTAINS用法

获取最大登录应用程序用户数以及何时

MYSQL "Like" 正向和反向词序查询

有没有比使用 MySQL 计划事件更好的方法来更新我的数据库表中的列?

MySQL:根据条件查找某些用户的行位置

如何在 mysql 的 group by 子句中 Select 最后创建的记录?

mysql insert into select join - 通过连接表将值从一列复制到另一表

如何从具有第一行列值的表中 Select 客户的最新记录

在表中找到最大值,然后分别显示SQL组和每个SQL组中的最大值计数

在 where 子句中左连接多个值

在 SQL 中的 case 语句之后将新列转换为 INT

Over() 函数不覆盖表中的所有行

将每组的总和除以总数

SQL 中的双杠 (||) 是什么意思?

授予用户对 MySQL 中有限数量表的访问权限

如何在 MySQL 中为用户设置默认架构

什么是全文索引,我应该什么时候使用它?

警告:mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES)

来自 MySQL 中多个表的 COUNT(*)