Skip to content

Commit ad22300

Browse files
authored
Perf: add extra index to notification table (#32395)
Index SQL: `CREATE INDEX u_s_uu ON notification(user_id, status, updated_unix);` The naming follows `action.go` in the same dir. I am unsure which version I should add SQL to the migration folder, so I have not modified it. Fix #32390
1 parent 0aedb03 commit ad22300

File tree

3 files changed

+127
-9
lines changed

3 files changed

+127
-9
lines changed

models/activities/notification.go

+49-9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"code.gitea.io/gitea/modules/timeutil"
1919

2020
"xorm.io/builder"
21+
"xorm.io/xorm/schemas"
2122
)
2223

2324
type (
@@ -50,25 +51,64 @@ const (
5051
// Notification represents a notification
5152
type Notification struct {
5253
ID int64 `xorm:"pk autoincr"`
53-
UserID int64 `xorm:"INDEX NOT NULL"`
54-
RepoID int64 `xorm:"INDEX NOT NULL"`
54+
UserID int64 `xorm:"NOT NULL"`
55+
RepoID int64 `xorm:"NOT NULL"`
5556

56-
Status NotificationStatus `xorm:"SMALLINT INDEX NOT NULL"`
57-
Source NotificationSource `xorm:"SMALLINT INDEX NOT NULL"`
57+
Status NotificationStatus `xorm:"SMALLINT NOT NULL"`
58+
Source NotificationSource `xorm:"SMALLINT NOT NULL"`
5859

59-
IssueID int64 `xorm:"INDEX NOT NULL"`
60-
CommitID string `xorm:"INDEX"`
60+
IssueID int64 `xorm:"NOT NULL"`
61+
CommitID string
6162
CommentID int64
6263

63-
UpdatedBy int64 `xorm:"INDEX NOT NULL"`
64+
UpdatedBy int64 `xorm:"NOT NULL"`
6465

6566
Issue *issues_model.Issue `xorm:"-"`
6667
Repository *repo_model.Repository `xorm:"-"`
6768
Comment *issues_model.Comment `xorm:"-"`
6869
User *user_model.User `xorm:"-"`
6970

70-
CreatedUnix timeutil.TimeStamp `xorm:"created INDEX NOT NULL"`
71-
UpdatedUnix timeutil.TimeStamp `xorm:"updated INDEX NOT NULL"`
71+
CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
72+
UpdatedUnix timeutil.TimeStamp `xorm:"updated NOT NULL"`
73+
}
74+
75+
// TableIndices implements xorm's TableIndices interface
76+
func (n *Notification) TableIndices() []*schemas.Index {
77+
indices := make([]*schemas.Index, 0, 8)
78+
usuuIndex := schemas.NewIndex("u_s_uu", schemas.IndexType)
79+
usuuIndex.AddColumn("user_id", "status", "updated_unix")
80+
indices = append(indices, usuuIndex)
81+
82+
// Add the individual indices that were previously defined in struct tags
83+
userIDIndex := schemas.NewIndex("idx_notification_user_id", schemas.IndexType)
84+
userIDIndex.AddColumn("user_id")
85+
indices = append(indices, userIDIndex)
86+
87+
repoIDIndex := schemas.NewIndex("idx_notification_repo_id", schemas.IndexType)
88+
repoIDIndex.AddColumn("repo_id")
89+
indices = append(indices, repoIDIndex)
90+
91+
statusIndex := schemas.NewIndex("idx_notification_status", schemas.IndexType)
92+
statusIndex.AddColumn("status")
93+
indices = append(indices, statusIndex)
94+
95+
sourceIndex := schemas.NewIndex("idx_notification_source", schemas.IndexType)
96+
sourceIndex.AddColumn("source")
97+
indices = append(indices, sourceIndex)
98+
99+
issueIDIndex := schemas.NewIndex("idx_notification_issue_id", schemas.IndexType)
100+
issueIDIndex.AddColumn("issue_id")
101+
indices = append(indices, issueIDIndex)
102+
103+
commitIDIndex := schemas.NewIndex("idx_notification_commit_id", schemas.IndexType)
104+
commitIDIndex.AddColumn("commit_id")
105+
indices = append(indices, commitIDIndex)
106+
107+
updatedByIndex := schemas.NewIndex("idx_notification_updated_by", schemas.IndexType)
108+
updatedByIndex.AddColumn("updated_by")
109+
indices = append(indices, updatedByIndex)
110+
111+
return indices
72112
}
73113

74114
func init() {

models/migrations/migrations.go

+1
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ func prepareMigrationTasks() []*migration {
366366
newMigration(306, "Add BlockAdminMergeOverride to ProtectedBranch", v1_23.AddBlockAdminMergeOverrideBranchProtection),
367367
newMigration(307, "Fix milestone deadline_unix when there is no due date", v1_23.FixMilestoneNoDueDate),
368368
newMigration(308, "Add index(user_id, is_deleted) for action table", v1_23.AddNewIndexForUserDashboard),
369+
newMigration(309, "Improve Notification table indices", v1_23.ImproveNotificationTableIndices),
369370
}
370371
return preparedMigrations
371372
}

models/migrations/v1_23/v309.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package v1_23 //nolint
5+
6+
import (
7+
"code.gitea.io/gitea/modules/timeutil"
8+
9+
"xorm.io/xorm"
10+
"xorm.io/xorm/schemas"
11+
)
12+
13+
type improveNotificationTableIndicesAction struct {
14+
ID int64 `xorm:"pk autoincr"`
15+
UserID int64 `xorm:"NOT NULL"`
16+
RepoID int64 `xorm:"NOT NULL"`
17+
18+
Status uint8 `xorm:"SMALLINT NOT NULL"`
19+
Source uint8 `xorm:"SMALLINT NOT NULL"`
20+
21+
IssueID int64 `xorm:"NOT NULL"`
22+
CommitID string
23+
CommentID int64
24+
25+
UpdatedBy int64 `xorm:"NOT NULL"`
26+
27+
CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
28+
UpdatedUnix timeutil.TimeStamp `xorm:"updated NOT NULL"`
29+
}
30+
31+
// TableName sets the name of this table
32+
func (*improveNotificationTableIndicesAction) TableName() string {
33+
return "notification"
34+
}
35+
36+
// TableIndices implements xorm's TableIndices interface
37+
func (*improveNotificationTableIndicesAction) TableIndices() []*schemas.Index {
38+
indices := make([]*schemas.Index, 0, 8)
39+
usuuIndex := schemas.NewIndex("u_s_uu", schemas.IndexType)
40+
usuuIndex.AddColumn("user_id", "status", "updated_unix")
41+
indices = append(indices, usuuIndex)
42+
43+
// Add the individual indices that were previously defined in struct tags
44+
userIDIndex := schemas.NewIndex("idx_notification_user_id", schemas.IndexType)
45+
userIDIndex.AddColumn("user_id")
46+
indices = append(indices, userIDIndex)
47+
48+
repoIDIndex := schemas.NewIndex("idx_notification_repo_id", schemas.IndexType)
49+
repoIDIndex.AddColumn("repo_id")
50+
indices = append(indices, repoIDIndex)
51+
52+
statusIndex := schemas.NewIndex("idx_notification_status", schemas.IndexType)
53+
statusIndex.AddColumn("status")
54+
indices = append(indices, statusIndex)
55+
56+
sourceIndex := schemas.NewIndex("idx_notification_source", schemas.IndexType)
57+
sourceIndex.AddColumn("source")
58+
indices = append(indices, sourceIndex)
59+
60+
issueIDIndex := schemas.NewIndex("idx_notification_issue_id", schemas.IndexType)
61+
issueIDIndex.AddColumn("issue_id")
62+
indices = append(indices, issueIDIndex)
63+
64+
commitIDIndex := schemas.NewIndex("idx_notification_commit_id", schemas.IndexType)
65+
commitIDIndex.AddColumn("commit_id")
66+
indices = append(indices, commitIDIndex)
67+
68+
updatedByIndex := schemas.NewIndex("idx_notification_updated_by", schemas.IndexType)
69+
updatedByIndex.AddColumn("updated_by")
70+
indices = append(indices, updatedByIndex)
71+
72+
return indices
73+
}
74+
75+
func ImproveNotificationTableIndices(x *xorm.Engine) error {
76+
return x.Sync(&improveNotificationTableIndicesAction{})
77+
}

0 commit comments

Comments
 (0)