mirror of
https://github.com/discourse/discourse.git
synced 2025-06-06 13:06:56 +08:00
PERF: avoid regex on uploads table (#12485)
In extreme circumstances when the uploads table is huge, the old version of this migration could take a very long time. The rewrite extracts the sha1 directly from the badges table and does an index based match on the uploads table
This commit is contained in:
@ -8,10 +8,16 @@ class AddImageUploadIdToBadges < ActiveRecord::Migration[6.0]
|
||||
DB.exec <<~SQL
|
||||
UPDATE badges b1
|
||||
SET image_upload_id = u.id
|
||||
FROM badges b2
|
||||
INNER JOIN uploads u
|
||||
ON b2.image ~ CONCAT('/', u.sha1, '\\.\\w')
|
||||
WHERE b1.id = b2.id
|
||||
FROM (
|
||||
SELECT id, (regexp_matches(b.image, '[a-f0-9]{40}'))[1] as sha1
|
||||
FROM badges b
|
||||
WHERE
|
||||
b.image IS NOT NULL AND
|
||||
b.image ~ '[a-f0-9]{40}'
|
||||
) b2
|
||||
JOIN uploads u ON u.sha1 = b2.sha1
|
||||
WHERE
|
||||
b1.id = b2.id
|
||||
SQL
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user