[GITEA] Use join for the deleting issue actions query

- The action tables can become very large as it's a dumpster for every
action that an user does on an repository.
- The following query: `DELETE FROM action WHERE comment_id IN (SELECT id FROM comment WHERE
issue_id=?)` is not using indexes for `comment_id` and is instead using
an full table scan by MariaDB.
- Rewriting the query to use an JOIN will allow MariaDB to use the
index.
- More information: https://codeberg.org/Codeberg-Infrastructure/techstack-support/issues/9
- Backport https://codeberg.org/forgejo/forgejo/pulls/1154
This commit is contained in:
Gusted 2023-07-29 16:59:23 +02:00 committed by Gusted
parent e7d0475e15
commit 9b71369be9
6 changed files with 45 additions and 7 deletions

View file

@ -242,6 +242,15 @@ func TestGetFeedsCorrupted(t *testing.T) {
assert.Equal(t, int64(0), count)
}
func TestDeleteIssueActions(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
comment := unittest.AssertExistsAndLoadBean(t, &issue_model.Comment{ID: 8})
unittest.AssertExistsAndLoadBean(t, &activities_model.Action{ID: 10, CommentID: comment.ID})
assert.NoError(t, activities_model.DeleteIssueActions(db.DefaultContext, 32, 17))
unittest.AssertNotExistsBean(t, &activities_model.Action{ID: 10, CommentID: comment.ID})
}
func TestConsistencyUpdateAction(t *testing.T) {
if !setting.Database.Type.IsSQLite3() {
t.Skip("Test is only for SQLite database.")