已关闭。此问题需要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'已经被索引了。有没有什么方法可以进一步优化这个查询或任何其他替代方法,以便尽快执行删除?
1条答案
按热度按时间ulmd4ohb1#
使用
这个ONE查询将删除所有
(client_id, user_id, data_point_id)
重复的行,除了一个具有最大id
值的重复行。如果你需要用最小的
id
来存储行,那么就使用WHERE t1.id > t2.id
。