修复节点详情页加载慢:text_message.from_id 加 varchar(191)+索引 #2

Merged
kevin merged 1 commits from dsh/meshtastic_mqtt_server:fix/text-message-from-id-index into main 2026-08-20 19:33:40 +08:00
Contributor

问题

节点详情页(/detailed/:nodeId)长时间停留在"正在加载节点详情...":按 from_id 查询聊天记录耗时约 10 秒(其余接口约 20ms)。

根因

text_message 表(本地 121 万行)的 from_id 列为 longtext 且无索引WHERE from_id = ? ORDER BY id DESC LIMIT n 触发全表扫描(EXPLAIN 显示走 PRIMARY + Using where)。节点详情页的 loadInitialMessages 依赖该查询,导致整页加载被拖慢。

channel_id 在 DBv1 中已做过同样的 TEXT→VARCHAR 处理,from_id 漏掉了。)

修复

  1. 结构体 TextMessageRecord.FromID 增加 type:varchar(191) 与索引标签——新装库建表即为 varchar(191) + idx_text_message_from_id 索引;
  2. 新增幂等迁移 migrateTextMessageFromIDIndex
    • MySQL:先把 from_id 改为 VARCHAR(191),再建完整索引(与 DBv1 的 channel_id 先例一致);
    • SQLite:直接建索引;
    • 索引已存在(如手工建的前缀索引)时跳过,不重复建。

验证

  • 线上已先手工加前缀索引 idx_text_message_from_id (from_id(191))(在线 DDL,无阻塞):
    • 该节点 /api/text-messages?from=!501492cf10.07s → 0.02s
    • EXPLAIN 由全表扫描变为 ref 走索引(4 行);
    • 其他节点查询同样降到 ~10ms。
  • go build ./... + go vet ./internal/store/ 通过。
## 问题 节点详情页(/detailed/:nodeId)长时间停留在"正在加载节点详情...":按 `from_id` 查询聊天记录耗时约 **10 秒**(其余接口约 20ms)。 ## 根因 `text_message` 表(本地 121 万行)的 `from_id` 列为 **longtext 且无索引**,`WHERE from_id = ? ORDER BY id DESC LIMIT n` 触发全表扫描(EXPLAIN 显示走 PRIMARY + Using where)。节点详情页的 `loadInitialMessages` 依赖该查询,导致整页加载被拖慢。 (`channel_id` 在 DBv1 中已做过同样的 TEXT→VARCHAR 处理,`from_id` 漏掉了。) ## 修复 1. 结构体 `TextMessageRecord.FromID` 增加 `type:varchar(191)` 与索引标签——新装库建表即为 varchar(191) + `idx_text_message_from_id` 索引; 2. 新增幂等迁移 `migrateTextMessageFromIDIndex`: - MySQL:先把 `from_id` 改为 `VARCHAR(191)`,再建完整索引(与 DBv1 的 channel_id 先例一致); - SQLite:直接建索引; - 索引已存在(如手工建的前缀索引)时跳过,不重复建。 ## 验证 - 线上已先手工加前缀索引 `idx_text_message_from_id (from_id(191))`(在线 DDL,无阻塞): - 该节点 `/api/text-messages?from=!501492cf` 从 **10.07s → 0.02s**; - EXPLAIN 由全表扫描变为 `ref` 走索引(4 行); - 其他节点查询同样降到 ~10ms。 - `go build ./...` + `go vet ./internal/store/` 通过。
dsh added 1 commit 2026-08-20 19:32:18 +08:00
kevin merged commit b817a82cad into main 2026-08-20 19:33:40 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/meshtastic_mqtt_server#2