mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	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
This commit is contained in:
		| @@ -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() { | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|   | ||||
							
								
								
									
										77
									
								
								models/migrations/v1_23/v309.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								models/migrations/v1_23/v309.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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{}) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user