我试图删除表名 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
最佳答案
神圣的嵌套 SELECT。
首先,移除第三个巢。 DELETE FROM pincodecheck WHERE pinId NOT IN (SELECT min(pinID) from pincodecheck GROUP BY pincode)
应该没问题。
如果您在从同一个表中删除时实际上想使用 tmpTable 来存储值,则实际插入到 tmp 表中并在子查询中使用它。仅仅使用别名不会有任何作用。
您可能需要将 EXPLAIN
粘贴在此查询的前面,看看是否可以识别出任何可能导致返回缓慢的步骤。我的猜测是MySQL将首先执行子查询获取min(PID),然后使用它从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
关于mysql - sql查询在大数据上需要时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26384362/