From d33ec0075d3885658da5c4da1bd11e0a3d90287f Mon Sep 17 00:00:00 2001 From: dsh Date: Thu, 20 Aug 2026 19:32:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=8A=82=E7=82=B9=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E5=8A=A0=E8=BD=BD=E6=85=A2:text=5Fmessage.fr?= =?UTF-8?q?om=5Fid=20=E5=8A=A0=20varchar(191)+=E7=B4=A2=E5=BC=95,=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E7=99=BE=E4=B8=87=E8=A1=8C=E5=85=A8=E8=A1=A8=E6=89=AB?= =?UTF-8?q?=E6=8F=8F(=E4=B8=8E=20channel=5Fid=20DBv1=20=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=B8=80=E8=87=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/store/db.go | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/internal/store/db.go b/internal/store/db.go index 82608da..77f70ca 100644 --- a/internal/store/db.go +++ b/internal/store/db.go @@ -435,7 +435,7 @@ func (MapReportRecord) TableName() string { type TextMessageRecord struct { ID uint64 `gorm:"column:id;primaryKey;autoIncrement"` - FromID string `gorm:"column:from_id;not null"` + FromID string `gorm:"column:from_id;not null;type:varchar(191);index:idx_text_message_from_id,priority:1"` FromNum int64 `gorm:"column:from_num;not null;index:idx_text_message_from_num_created_at,priority:1"` Text *string `gorm:"column:text"` PayloadHex *string `gorm:"column:payload_hex"` @@ -742,6 +742,9 @@ func (s *Store) migrate() error { if err := migrateBotNodePSK(tx, migrator, s.driver); err != nil { return err } + if err := migrateTextMessageFromIDIndex(tx, migrator, s.driver); err != nil { + return err + } if err := migrateBotDirectMessages(tx, migrator); err != nil { return err } @@ -768,6 +771,33 @@ func (s *Store) migrate() error { }) } +// migrateTextMessageFromIDIndex 为 text_message.from_id 建立索引。 +// 该列历史版本为 longtext(无法直接建索引),节点详情页/聊天按 from_id 过滤时 +// 会全表扫描(百万级行,耗时数秒)。与 channel_id 的 DBv1 处理一致: +// MySQL 先把列改为 VARCHAR(191) 再建完整索引;SQLite 直接建索引即可。 +// 幂等:索引已存在时跳过(老库可能已有手工建的前缀索引)。 +func migrateTextMessageFromIDIndex(tx *gorm.DB, migrator gorm.Migrator, driver string) error { + if !migrator.HasTable(&TextMessageRecord{}) { + return nil + } + if migrator.HasIndex(&TextMessageRecord{}, "idx_text_message_from_id") { + return nil + } + if driver == config.DriverSQLite { + if err := tx.Exec("CREATE INDEX idx_text_message_from_id ON text_message(from_id)").Error; err != nil { + return fmt.Errorf("create text_message.from_id index: %w", err) + } + return nil + } + if err := tx.Exec("ALTER TABLE text_message MODIFY COLUMN from_id VARCHAR(191) NOT NULL").Error; err != nil { + return fmt.Errorf("alter text_message.from_id to varchar: %w", err) + } + if err := tx.Exec("ALTER TABLE text_message ADD KEY idx_text_message_from_id (from_id)").Error; err != nil { + return fmt.Errorf("add text_message.from_id index: %w", err) + } + return nil +} + func migrateBotNodePSK(tx *gorm.DB, migrator gorm.Migrator, driver string) error { if !migrator.HasTable(&BotNodeRecord{}) { return nil -- 2.47.3