首页 > 解决方案 > 删除查询需要很长时间才能在 Google Cloud MySQL 中运行

问题描述

我在 Google Cloud 的 MySql 数据库中有一个包含 433,332 条记录的表。表看起来像这样

Album_ID | Track_Len | Track_Name                            | Ft_LName1 | Ft_FName1 | Ft_LName2 | Ft_FName2 | Ft_LName3 | Ft_FName3 | Row_Num |
+---------+-----------+---------------------------------------+-----------+-----------+-----------+-----------+-----------+-----------+---------+
| N40781  |      5.19 | Tumbala (Da Lata Remix)               | NULL      | Novalima  | NULL      | NULL      | NULL      | NULL      |       1 |
| N40781  |      5.01 | Ruperta (Zeb Remix)                   | NULL      | Novalima  | NULL      | NULL      | NULL      | NULL      |       2 |
| N40781  |      6.35 | Coba Guarango (Toni Economides Remix) | NULL      | Novalima  | NULL      | NULL      | NULL      | NULL      |       3 |
| B15033  |      6.02 | II-V-P                                | Quartet   | ARC       | NULL      | NULL      | NULL      | NULL      |       4 |
| N32395  |      4.47 | My Babe                               | Stigers   | Curtis    | NULL      | NULL      | NULL      | NULL      |       5 |
| N32395  |      5.13 | Thats All Right                       | Stigers   | Curtis    | NULL      | NULL      | NULL      | NULL      |       6 |

请注意,该表的主键应该是 (Album_ID, Track_Name) 我知道表中有重复的数据条目。我正在尝试运行以下查询来查找和删除这些条目:

select count(*) 
from Track t1, Track t2 
where t1.Album_ID = t2.Album_ID 
AND t1.Track_Name = t2.Track_Name 
AND t1.Row_Num > t2.Row_Num;

但是,这需要很长时间才能运行。谁能建议一种更有效的方法来做到这一点?

标签: mysqlsqlgoogle-cloud-platform

解决方案


要获取重复列表,我建议:

select Album_ID, Track_Name, count(*) 
from Track t
group by Album_ID, Track_Name,
having count(*) > 1

如果你想要计数,那么:

select count(*) as num_keys_with_duplicates,
       sum(cnt - 1) as num_duplicates
from (select Album_ID, Track_Name, count(*) as cnt
      from Track t
      group by Album_ID, Track_Name,
      having count(*) > 1
     ) x;

推荐阅读