sql查询需要花费大量数据

时间:2014-10-15 13:55:02

标签: mysql sql phpmyadmin

我正在尝试删除表名pincodecheck中的重复条目,但每当我在phpMyAdmin中运行sql查询时,它会一直显示加载并且没有任何反应。

该表包含大约1,500,000个条目,因此只占表格的一小部分来说明问题。

我正在运行的SQL查询:

DELETE FROM pincodecheck WHERE pinId NOT IN
(SELECT MIN(pinId) FROM (SELECT * FROM pincodecheck) AS tmpTable GROUP BY pincode)

表格结构

pinId   pincode deliveryStatus  divisionName    regionName  circleName  taluk   districtName stateName
146859  700031  Delivery        Calcutta South  Calcutta    West Bengal Kolkata Kolkata      WEST BENGAL
146860  700031  Delivery        Calcutta South  Calcutta    West Bengal Kolkata Kolkata      WEST BENGAL
146861  700031  Delivery        Calcutta South  Calcutta    West Bengal Kolkata Kolkata      WEST BENGAL

2 个答案:

答案 0 :(得分:1)

神圣嵌套的SELECT。

首先,删除第三个巢。 DELETE FROM pincodecheck WHERE pinId NOT IN (SELECT min(pinID) from pincodecheck GROUP BY pincode)应该没问题。

如果您实际上想要在从同一个表中删除时使用tmpTable来存储值,那么实际插入到tmp表中并在子查询中使用它。简单地使用别名并不会做任何事情。

您可能希望将EXPLAIN放在此查询的前面,看看是否可以识别可能导致返回缓慢的任何步骤。我的猜测是,MySQL将首先获得min(PID)执行子查询,然后使用它来DELETE FROM pincodecheck。

编辑添加:

这可能只是一个需要很长时间的情况。如果SELECT min(pinId) FROM pincodecheck GROUP BY pincode的结果非常大(我假设它们是一个重复数据删除练习),那么它将花费很长时间来使用mysql。它必须在pincodecheck中检查每个单独的记录,以防止从该查询返回的内容。

也许......你能做的就是编写一个查询来获得你想要的最终结果,并使用它来插入一个新表,删除旧表,然后重命名新表以获取它'的地方。类似的东西:

CREATE TABLE <newtable> AS 
    SELECT * 
    FROM 
        pincodecheck main
        LEFT OUTER JOIN
            (
                SELECT pincode, min(pinId) as minPinId
                FROM pincodecheck
                GROUP BY pincode
            ) sub ON
            main.pincode = sub.pincode and
            main.pinId = sub.MinPinId
    WHERE
        sub.pinCode IS NULL

答案 1 :(得分:0)

基本上,您正在尝试为每个唯一的密码保留MIN(pinId)。

试试这个:

CREATE INDEX idx_pincode ON pincodecheck;
CREATE TABLE pincodecheck_new LIKE pincodecheck;
INSERT INTO pincodecheck_new SELECT MIN(pinId), pincode, deliveryStatus, divisionName, regionName, circleName  taluk, districtName, stateName FROM pincodecheck GROUP BY pincode, deliveryStatus, divisionName, regionName, circleName  taluk, districtName, stateName;
RENAME TABLE pincodecheck TO pincodecheck_old, pincodecheck_new TO pincodecheck;