]> source.dussan.org Git - gitea.git/commitdiff
Perf: add extra index to notification table (#32395)
authorBoYanZh <boyanzh233@gmail.com>
Wed, 13 Nov 2024 18:17:54 +0000 (13:17 -0500)
committerGitHub <noreply@github.com>
Wed, 13 Nov 2024 18:17:54 +0000 (18:17 +0000)
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

models/activities/notification.go
models/migrations/migrations.go
models/migrations/v1_23/v309.go [new file with mode: 0644]

index b888adeb60fe524c8b5059919574017029a2b8d9..6dde26fd53e5b5faa04db7d08b0cac94bc517eb2 100644 (file)
@@ -18,6 +18,7 @@ import (
        "code.gitea.io/gitea/modules/timeutil"
 
        "xorm.io/builder"
+       "xorm.io/xorm/schemas"
 )
 
 type (
@@ -50,25 +51,64 @@ const (
 // Notification represents a notification
 type Notification struct {
        ID     int64 `xorm:"pk autoincr"`
-       UserID int64 `xorm:"INDEX NOT NULL"`
-       RepoID int64 `xorm:"INDEX NOT NULL"`
+       UserID int64 `xorm:"NOT NULL"`
+       RepoID int64 `xorm:"NOT NULL"`
 
-       Status NotificationStatus `xorm:"SMALLINT INDEX NOT NULL"`
-       Source NotificationSource `xorm:"SMALLINT INDEX NOT NULL"`
+       Status NotificationStatus `xorm:"SMALLINT NOT NULL"`
+       Source NotificationSource `xorm:"SMALLINT NOT NULL"`
 
-       IssueID   int64  `xorm:"INDEX NOT NULL"`
-       CommitID  string `xorm:"INDEX"`
+       IssueID   int64 `xorm:"NOT NULL"`
+       CommitID  string
        CommentID int64
 
-       UpdatedBy int64 `xorm:"INDEX NOT NULL"`
+       UpdatedBy int64 `xorm:"NOT NULL"`
 
        Issue      *issues_model.Issue    `xorm:"-"`
        Repository *repo_model.Repository `xorm:"-"`
        Comment    *issues_model.Comment  `xorm:"-"`
        User       *user_model.User       `xorm:"-"`
 
-       CreatedUnix timeutil.TimeStamp `xorm:"created INDEX NOT NULL"`
-       UpdatedUnix timeutil.TimeStamp `xorm:"updated INDEX NOT NULL"`
+       CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
+       UpdatedUnix timeutil.TimeStamp `xorm:"updated NOT NULL"`
+}
+
+// TableIndices implements xorm's TableIndices interface
+func (n *Notification) TableIndices() []*schemas.Index {
+       indices := make([]*schemas.Index, 0, 8)
+       usuuIndex := schemas.NewIndex("u_s_uu", schemas.IndexType)
+       usuuIndex.AddColumn("user_id", "status", "updated_unix")
+       indices = append(indices, usuuIndex)
+
+       // Add the individual indices that were previously defined in struct tags
+       userIDIndex := schemas.NewIndex("idx_notification_user_id", schemas.IndexType)
+       userIDIndex.AddColumn("user_id")
+       indices = append(indices, userIDIndex)
+
+       repoIDIndex := schemas.NewIndex("idx_notification_repo_id", schemas.IndexType)
+       repoIDIndex.AddColumn("repo_id")
+       indices = append(indices, repoIDIndex)
+
+       statusIndex := schemas.NewIndex("idx_notification_status", schemas.IndexType)
+       statusIndex.AddColumn("status")
+       indices = append(indices, statusIndex)
+
+       sourceIndex := schemas.NewIndex("idx_notification_source", schemas.IndexType)
+       sourceIndex.AddColumn("source")
+       indices = append(indices, sourceIndex)
+
+       issueIDIndex := schemas.NewIndex("idx_notification_issue_id", schemas.IndexType)
+       issueIDIndex.AddColumn("issue_id")
+       indices = append(indices, issueIDIndex)
+
+       commitIDIndex := schemas.NewIndex("idx_notification_commit_id", schemas.IndexType)
+       commitIDIndex.AddColumn("commit_id")
+       indices = append(indices, commitIDIndex)
+
+       updatedByIndex := schemas.NewIndex("idx_notification_updated_by", schemas.IndexType)
+       updatedByIndex.AddColumn("updated_by")
+       indices = append(indices, updatedByIndex)
+
+       return indices
 }
 
 func init() {
index 0333e7e204aad5bcf8a44c0e253618afedcc86aa..e0361af86ba8e5b9bd5611be296438bf8d697094 100644 (file)
@@ -366,6 +366,7 @@ func prepareMigrationTasks() []*migration {
                newMigration(306, "Add BlockAdminMergeOverride to ProtectedBranch", v1_23.AddBlockAdminMergeOverrideBranchProtection),
                newMigration(307, "Fix milestone deadline_unix when there is no due date", v1_23.FixMilestoneNoDueDate),
                newMigration(308, "Add index(user_id, is_deleted) for action table", v1_23.AddNewIndexForUserDashboard),
+               newMigration(309, "Improve Notification table indices", v1_23.ImproveNotificationTableIndices),
        }
        return preparedMigrations
 }
diff --git a/models/migrations/v1_23/v309.go b/models/migrations/v1_23/v309.go
new file mode 100644 (file)
index 0000000..5b39398
--- /dev/null
@@ -0,0 +1,77 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package v1_23 //nolint
+
+import (
+       "code.gitea.io/gitea/modules/timeutil"
+
+       "xorm.io/xorm"
+       "xorm.io/xorm/schemas"
+)
+
+type improveNotificationTableIndicesAction struct {
+       ID     int64 `xorm:"pk autoincr"`
+       UserID int64 `xorm:"NOT NULL"`
+       RepoID int64 `xorm:"NOT NULL"`
+
+       Status uint8 `xorm:"SMALLINT NOT NULL"`
+       Source uint8 `xorm:"SMALLINT NOT NULL"`
+
+       IssueID   int64 `xorm:"NOT NULL"`
+       CommitID  string
+       CommentID int64
+
+       UpdatedBy int64 `xorm:"NOT NULL"`
+
+       CreatedUnix timeutil.TimeStamp `xorm:"created NOT NULL"`
+       UpdatedUnix timeutil.TimeStamp `xorm:"updated NOT NULL"`
+}
+
+// TableName sets the name of this table
+func (*improveNotificationTableIndicesAction) TableName() string {
+       return "notification"
+}
+
+// TableIndices implements xorm's TableIndices interface
+func (*improveNotificationTableIndicesAction) TableIndices() []*schemas.Index {
+       indices := make([]*schemas.Index, 0, 8)
+       usuuIndex := schemas.NewIndex("u_s_uu", schemas.IndexType)
+       usuuIndex.AddColumn("user_id", "status", "updated_unix")
+       indices = append(indices, usuuIndex)
+
+       // Add the individual indices that were previously defined in struct tags
+       userIDIndex := schemas.NewIndex("idx_notification_user_id", schemas.IndexType)
+       userIDIndex.AddColumn("user_id")
+       indices = append(indices, userIDIndex)
+
+       repoIDIndex := schemas.NewIndex("idx_notification_repo_id", schemas.IndexType)
+       repoIDIndex.AddColumn("repo_id")
+       indices = append(indices, repoIDIndex)
+
+       statusIndex := schemas.NewIndex("idx_notification_status", schemas.IndexType)
+       statusIndex.AddColumn("status")
+       indices = append(indices, statusIndex)
+
+       sourceIndex := schemas.NewIndex("idx_notification_source", schemas.IndexType)
+       sourceIndex.AddColumn("source")
+       indices = append(indices, sourceIndex)
+
+       issueIDIndex := schemas.NewIndex("idx_notification_issue_id", schemas.IndexType)
+       issueIDIndex.AddColumn("issue_id")
+       indices = append(indices, issueIDIndex)
+
+       commitIDIndex := schemas.NewIndex("idx_notification_commit_id", schemas.IndexType)
+       commitIDIndex.AddColumn("commit_id")
+       indices = append(indices, commitIDIndex)
+
+       updatedByIndex := schemas.NewIndex("idx_notification_updated_by", schemas.IndexType)
+       updatedByIndex.AddColumn("updated_by")
+       indices = append(indices, updatedByIndex)
+
+       return indices
+}
+
+func ImproveNotificationTableIndices(x *xorm.Engine) error {
+       return x.Sync(&improveNotificationTableIndicesAction{})
+}