mysql 我如何进一步优化此查询,或者是否有任何其他替代方案?[已关闭]

fcg9iug3  于 2023-03-28  发布在  Mysql
关注(0)|答案(1)|浏览(143)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

18小时前关门了。
Improve this question
我有一个有3700万条记录的表(1100万条重复记录),我想删除基于三列的所有重复记录。目前我已经在laravel 7中编写了一个命令来这样做-

$oldUserStatsQuery = DB::table('user_stats_data')
        ->select('user_stats_data.id')
        ->leftJoin(
            DB::raw(
                '(SELECT MAX(id) AS id FROM user_stats_data GROUP BY client_id, user_id, data_point_id) AS max_stats_data'
            ),
            function ($join) {
                $join->on('user_stats_data.id', '=', 'max_stats_data.id');
            }
        )
        ->whereNull('max_stats_data.id')
        ->orderBy('user_stats_data.id');

$oldUserStatsQuery
        ->chunkById($this->chunkSize, function (Collection $chunks) use (&$deletedCount) {
            $ids = $chunks->pluck('id')->toArray();
            $idsString = implode(',', $ids);
            DB::statement("DELETE FROM user_stats_data WHERE id IN ($idsString)");

            $deleteCount = count($ids);
            $deletedCount += $deleteCount;
            $this->info("{$deleteCount} rows deleted.. ({$deletedCount} in total)");
        }, 'user_stats_data.id', 'id');

这段代码花了大约7个小时才删除了780 k条记录。'user_id','client_id'和'data_point_id'已经被索引了。有没有什么方法可以进一步优化这个查询或任何其他替代方法,以便尽快执行删除?

ulmd4ohb

ulmd4ohb1#

使用

DELETE t1
FROM user_stats_data t1
JOIN user_stats_data t2 USING (client_id, user_id, data_point_id)
WHERE t1.id < t2.id;

这个ONE查询将删除所有(client_id, user_id, data_point_id)重复的行,除了一个具有最大id值的重复行。
如果你需要用最小的id来存储行,那么就使用WHERE t1.id > t2.id

相关问题