gpt4 book ai didi

mysql - 针对特定极慢查询的优化

转载 作者:行者123 更新时间:2023-11-29 16:26:11 24 4
gpt4 key购买 nike

我在优化一个执行相同操作但使用 3 个不同查询和 2 个循环的 php 脚本后编写了这个查询...而这个 php 脚本运行了 6 个多小时...因此,我将所有内容压缩到一个简单的查询中,将其压缩到同一个作业,没有任何循环......

DELETE table  FROM table WHERE id IN  (
SELECT id from(
SELECT MAX(data_elab) as data_elab_new, count(*) as volte,t1.* FROM (
SELECT * from table ORDER BY data_elab DESC
)t1
group by cod_dl,issn,variante,add_on having volte>1
)t2
);

注意:服务器很旧(Windows,3GB内存,32位),表大小204 MB,100.000行,20列,只有id为主键,没有索引。

这个查询只花了 20 秒......删除是问题......

SELECT id from(
SELECT MAX(data_elab) as data_elab_new, count(*) as volte,t1.* FROM (
SELECT * from table ORDER BY data_elab DESC
)t1
group by cod_dl,issn,variante,add_on having volte>1
)t2

问题是我想加快操作速度,但实际上两个多小时后查询没有完成并继续工作......

有任何优化此查询的建议吗?或者我在查询中做错了什么?

谢谢。

最佳答案

假设data_elab对于cod_dl、issn、variete、add_on的任何组合都不会重复(我假设这就是“univocal”的含义),这是您需要的查询应采用的形式:

DELETE table 
FROM table
WHERE (cod_dl, issn, variante, add_on, data_elab) IN (
SELECT cod_dl, issn, variante, add_on, MAX(data_elab) as data_elab_max
FROM table
GROUP BY cod_dl, issn, variante, add_on
HAVING COUNT(*) > 1
);

由于 MySQL 不喜欢在查询中从同一个表中进行 DELETE 和 SELECT 操作,因此您可能需要进行一些调整,例如:

DELETE table 
FROM table
WHERE (cod_dl, issn, variante, add_on, data_elab) IN (
SELECT extraLayerOfIndirection.*
FROM (
SELECT cod_dl, issn, variante, add_on, MAX(data_elab) as data_elab_max
FROM table
GROUP BY cod_dl, issn, variante, add_on
HAVING COUNT(*) > 1
) AS extraLayerOfIndirection
);
<小时/>

此外,并不完全相同,但您可能需要考虑这一点:

DELETE table 
FROM table
WHERE (cod_dl, issn, variante, add_on, data_elab) NOT IN (
SELECT extraLayerOfIndirection.*
FROM (
SELECT cod_dl, issn, variante, add_on, MIN(data_elab) as data_elab_max
FROM table
GROUP BY cod_dl, issn, variante, add_on
) AS extraLayerOfIndirection
);

这不是只删除每个分组的最后一个,而是删除每个分组中除第一个分组之外的所有分组。如果您有很多重复项,并且只想保留每个分组的第一个分组,则可以这样做子查询的结果可能要小得多。

关于mysql - 针对特定极慢查询的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54221917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com