Mysql 如何在数百万行上运行此复杂查询

Mysql 如何在数百万行上运行此复杂查询,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,我有数百万行Message.rb 我正在尝试运行一个迁移: add_index :messages, [:mm_id, :c_id, :s_id], unique: true, name: :mm_unique 但是,迁移失败,因为它正在查找重复的行。我不在乎s_id的值是什么(只要它是一个整数),s_id和mm_id只需要在c_id的范围内是唯一的 所以我需要做的是找到所有消息,其中mm_id不为NULL,并且mm_id、s_id和c_id有重复的行 那么,如何编写查询以快速修复此问题?我想

我有数百万行Message.rb

我正在尝试运行一个迁移:

add_index :messages, [:mm_id, :c_id, :s_id], unique: true, name: :mm_unique
但是,迁移失败,因为它正在查找重复的行。我不在乎s_id的值是什么(只要它是一个整数),s_id和mm_id只需要在c_id的范围内是唯一的

所以我需要做的是找到所有消息,其中mm_id不为NULL,并且mm_id、s_id和c_id有重复的行


那么,如何编写查询以快速修复此问题?我想在s_id上设置一个随机值,只要它是一个整数,因为我不关心该值是什么。

您的查询应该是查找重复的行:

Message.joins("INNER JOIN 
               ( SELECT mm_id, s_id, c_id, COUNT(*) total_count
                 FROM messages GROUP BY mm_id, s_id, and c_id
                 HAVING  COUNT(*) >= 2
               ) b ON messages.mm_id = b.mm_id AND
                 messages.s_id = b.s_id AND messages.c_id = b.c_id"
             )
        .where("messages.mm_id IS NOT NULL")
        .select("messages.*, b.total_count AS duplicate")