improve activity tab performance by adding indexes

This commit is contained in:
pa
2026-03-20 17:46:41 +09:00
parent 4570f254ea
commit ad5b9ab48d
7 changed files with 89 additions and 199 deletions
+14 -7
View File
@@ -195,16 +195,23 @@ async function upsertMeta(entry) {
}
async function upsertSessions(userId, sessions = []) {
for (const session of sessions) {
const chunkSize = 250;
for (let chunkStart = 0; chunkStart < sessions.length; chunkStart += chunkSize) {
const chunk = sessions.slice(chunkStart, chunkStart + chunkSize);
const args = {};
const values = chunk.map((session, index) => {
const suffix = `${chunkStart + index}`;
args[`@user_id_${suffix}`] = userId;
args[`@start_at_${suffix}`] = session.start;
args[`@end_at_${suffix}`] = session.end;
return `(@user_id_${suffix}, @start_at_${suffix}, @end_at_${suffix})`;
});
await sqliteService.executeNonQuery(
`INSERT OR REPLACE INTO ${dbVars.userPrefix}_activity_cache_sessions
(user_id, start_at, end_at)
VALUES (@user_id, @start_at, @end_at)`,
{
'@user_id': userId,
'@start_at': session.start,
'@end_at': session.end
}
VALUES ${values.join(', ')}`,
args
);
}
}
+3
View File
@@ -72,6 +72,9 @@ const database = {
await sqliteService.executeNonQuery(
`CREATE TABLE IF NOT EXISTS ${dbVars.userPrefix}_feed_online_offline (id INTEGER PRIMARY KEY, created_at TEXT, user_id TEXT, display_name TEXT, type TEXT, location TEXT, world_name TEXT, time INTEGER, group_name TEXT)`
);
await sqliteService.executeNonQuery(
`CREATE INDEX IF NOT EXISTS ${dbVars.userPrefix}_feed_online_offline_user_created_idx ON ${dbVars.userPrefix}_feed_online_offline (user_id, created_at)`
);
await sqliteService.executeNonQuery(
`CREATE TABLE IF NOT EXISTS ${dbVars.userPrefix}_activity_cache_meta (user_id TEXT PRIMARY KEY, updated_at TEXT, is_self INTEGER DEFAULT 0, source_last_created_at TEXT, pending_session_start_at INTEGER)`
);
+17
View File
@@ -15,6 +15,11 @@ const tableAlter = {
// await sqliteService.executeNonQuery('PRAGMA user_version = 1');
},
async updateActivityTabDatabaseVersion() {
await this.ensureActivityCacheTables();
await this.ensureFeedOnlineOfflineIndexes();
},
async updateTableForGroupNames() {
var tables = [];
await sqliteService.execute((dbRow) => {
@@ -100,6 +105,18 @@ const tableAlter = {
`CREATE INDEX IF NOT EXISTS ${userPrefix}_activity_cache_sessions_user_start_idx ON ${userPrefix}_activity_cache_sessions (user_id, start_at)`
);
}
},
async ensureFeedOnlineOfflineIndexes() {
const tables = [];
await sqliteService.execute((dbRow) => {
tables.push(dbRow[0]);
}, `SELECT name FROM sqlite_schema WHERE type='table' AND name LIKE '%_feed_online_offline'`);
for (const tableName of tables) {
await sqliteService.executeNonQuery(
`CREATE INDEX IF NOT EXISTS ${tableName}_user_created_idx ON ${tableName} (user_id, created_at)`
);
}
}
};