大量消息收件箱完成第一层性能优化

This commit is contained in:
biss committed 2026-08-10 17:09:51 +08:00
1 parent 7731a343d7
commit e4f1d88ca1
6 files changed
+7024 -4

No files matched your search

@@ -58,6 +58,7 @@ public sealed class NotificationsController(
var total = await source.CountAsync(cancellationToken); var total = await source.CountAsync(cancellationToken);
var items = await source var items = await source
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.CreatedAt)
.ThenByDescending(x => x.Id)
.Skip((page - 1) * pageSize) .Skip((page - 1) * pageSize)
.Take(pageSize) .Take(pageSize)
.Select(x => new .Select(x => new
@@ -1475,8 +1475,11 @@ public sealed class AppDbContext(DbContextOptions<AppDbContext> options)
entity.Property(x => x.Title).HasMaxLength(200); entity.Property(x => x.Title).HasMaxLength(200);
entity.Property(x => x.Content).HasColumnType("longtext"); entity.Property(x => x.Content).HasColumnType("longtext");
entity.Property(x => x.LinkUrl).HasMaxLength(300); entity.Property(x => x.LinkUrl).HasMaxLength(300);
entity.HasIndex(x => new { x.UserId, x.IsRead }); // Each inbox query starts with its recipient. Keep the selected
entity.HasIndex(x => new { x.UserId, x.Category, x.CreatedAt }); // sort fields in the index so large inboxes do not need a filesort.
entity.HasIndex(x => new { x.UserId, x.CreatedAt, x.Id });
entity.HasIndex(x => new { x.UserId, x.IsRead, x.CreatedAt, x.Id });
entity.HasIndex(x => new { x.UserId, x.Category, x.CreatedAt, x.Id });
entity.HasIndex(x => x.MessageDispatchId); entity.HasIndex(x => x.MessageDispatchId);
entity.HasIndex(x => x.CreatedAt); entity.HasIndex(x => x.CreatedAt);
entity.HasOne(x => x.MessageDispatch) entity.HasOne(x => x.MessageDispatch)
@@ -102,6 +102,8 @@ public sealed class DevelopmentSqliteMigrator(
"20260809_53_course_grade_statistics_refresh_settings"; "20260809_53_course_grade_statistics_refresh_settings";
private const string ExperimentCourseGradesMigration = private const string ExperimentCourseGradesMigration =
"20260809_54_experiment_course_grades"; "20260809_54_experiment_course_grades";
private const string NotificationInboxIndexesMigration =
"20260810_55_notification_inbox_indexes";
public async Task MigrateAsync(CancellationToken cancellationToken = default) public async Task MigrateAsync(CancellationToken cancellationToken = default)
{ {
@@ -731,6 +733,10 @@ public sealed class DevelopmentSqliteMigrator(
ExperimentCourseGradesMigration, ExperimentCourseGradesMigration,
experimentCourseGradesExist ? [] : ExperimentCourseGradesStatements, experimentCourseGradesExist ? [] : ExperimentCourseGradesStatements,
cancellationToken); cancellationToken);
await ApplyMigrationAsync(
NotificationInboxIndexesMigration,
NotificationInboxIndexesStatements,
cancellationToken);
} }
private async Task ApplyMigrationAsync( private async Task ApplyMigrationAsync(
@@ -2999,6 +3005,15 @@ public sealed class DevelopmentSqliteMigrator(
"""CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseGradeStatisticsRefreshSettings_Key" ON "CourseGradeStatisticsRefreshSettings" ("Key");""" """CREATE UNIQUE INDEX IF NOT EXISTS "IX_CourseGradeStatisticsRefreshSettings_Key" ON "CourseGradeStatisticsRefreshSettings" ("Key");"""
]; ];
private static readonly string[] NotificationInboxIndexesStatements =
[
"""DROP INDEX "IX_Notifications_UserId_IsRead";""",
"""DROP INDEX "IX_Notifications_UserId_Category_CreatedAt";""",
"""CREATE INDEX "IX_Notifications_UserId_CreatedAt_Id" ON "Notifications" ("UserId", "CreatedAt", "Id");""",
"""CREATE INDEX "IX_Notifications_UserId_IsRead_CreatedAt_Id" ON "Notifications" ("UserId", "IsRead", "CreatedAt", "Id");""",
"""CREATE INDEX "IX_Notifications_UserId_Category_CreatedAt_Id" ON "Notifications" ("UserId", "Category", "CreatedAt", "Id");"""
];
private static readonly string[] ExperimentCourseGradesStatements = private static readonly string[] ExperimentCourseGradesStatements =
[ [
""" """
Loaded 3 of 6 files, more files were not shown because too many files have changed in this diff. Show more