From 58a1d0ca32cce1d3cb457b4195afac43319e5fee Mon Sep 17 00:00:00 2001 From: ice-myles <96409608+ice-myles@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:47:40 +0300 Subject: [PATCH] Fixed updateReferredByForAllT1Referrals sql timeouts: using orderby random() only 1 time for all users instead of for each record. --- go.mod | 4 +-- go.sum | 4 +-- users/users_delete.go | 58 +++++++++++++++++++++++-------------------- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index b6f8ba3b..f6843ed8 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.5.0 // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v25.0.2+incompatible // indirect + github.com/docker/docker v25.0.3+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -66,7 +66,7 @@ require ( github.com/go-openapi/swag v0.22.9 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.17.0 // indirect + github.com/go-playground/validator/v10 v10.18.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/goccy/go-reflect v1.2.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect diff --git a/go.sum b/go.sum index 25c074af..052c6d8f 100644 --- a/go.sum +++ b/go.sum @@ -125,8 +125,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.17.0 h1:SmVVlfAOtlZncTxRuinDPomC2DkXJ4E5T9gDA0AIH74= -github.com/go-playground/validator/v10 v10.17.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U= +github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= diff --git a/users/users_delete.go b/users/users_delete.go index ee2bc5a3..8a67bf96 100644 --- a/users/users_delete.go +++ b/users/users_delete.go @@ -93,34 +93,38 @@ func (r *repository) updateReferredByForAllT1Referrals(ctx context.Context, user if ctx.Err() != nil { return errors.Wrap(ctx.Err(), "context failed") } - sql := `SELECT ( SELECT X.ID + sql := ` + WITH randomized AS ( + SELECT id, referred_by, created_at FROM users + WHERE id != 'bogus' + AND id != 'icenetwork' + AND username != id + AND referred_by != id + AND id != $1 + AND referred_by != $1 + ORDER BY random() + ) + SELECT ( SELECT X.ID FROM ( SELECT X.ID - FROM ( SELECT r.id - FROM users r - WHERE 1=1 - AND r.id != 'bogus' - AND r.id != 'icenetwork' - AND r.id != $1 - AND r.id != u.id - AND r.referred_by != u.id - AND r.referred_by != r.id - AND r.username != r.id - AND r.referred_by != $1 - AND r.created_at < u.created_at - ORDER BY RANDOM() - LIMIT 1 - ) X - - UNION ALL - - SELECT u.id AS ID - ) X - LIMIT 1 - ) new_referred_by, - u.ID as id - FROM users u - WHERE u.referred_by = $1 - AND u.id != $1` + FROM ( + SELECT r.id + FROM randomized r + WHERE r.id != u.id + AND r.referred_by != u.id + AND r.created_at < u.created_at + LIMIT 1 + ) X + + UNION ALL + + SELECT u.id AS ID + ) X + LIMIT 1 + ) new_referred_by, + u.ID as id + FROM users u + WHERE u.referred_by = $1 + AND u.id != $1` type resp struct { NewReferredBy UserID ID UserID `db:"id"`