mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 00:46:31 +03:00
Merge pull request #1881 from deltachat/fix-bottleneck
add an index to significantly speed up get_fresh_msg_cnt()
This commit is contained in:
10
src/chat.rs
10
src/chat.rs
@@ -375,6 +375,16 @@ impl ChatId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_fresh_msg_cnt(self, context: &Context) -> usize {
|
pub async fn get_fresh_msg_cnt(self, context: &Context) -> usize {
|
||||||
|
// this function is typically used to show a badge counter beside _each_ chatlist item.
|
||||||
|
// to make this as fast as possible, esp. on older devices, we added an combined index over the rows used for querying.
|
||||||
|
// so if you alter the query here, you may want to alter the index over `(state, hidden, chat_id)` in `sql.rs`.
|
||||||
|
//
|
||||||
|
// the impact of the index is significant once the database grows:
|
||||||
|
// - on an older android4 with 18k messages, query-time decreased from 110ms to 2ms
|
||||||
|
// - on an mid-class moto-g or iphone7 with 50k messages, query-time decreased from 26ms or 6ms to 0-1ms
|
||||||
|
// the times are average, no matter if there are fresh messages or not -
|
||||||
|
// and have to be multiplied by the number of items shown at once on the chatlist,
|
||||||
|
// so savings up to 2 seconds are possible on older devices - newer ones will feel "snappier" :)
|
||||||
context
|
context
|
||||||
.sql
|
.sql
|
||||||
.query_get_value::<i32>(
|
.query_get_value::<i32>(
|
||||||
|
|||||||
10
src/sql.rs
10
src/sql.rs
@@ -1315,6 +1315,16 @@ async fn open(
|
|||||||
}
|
}
|
||||||
sql.set_raw_config_int(context, "dbversion", 67).await?;
|
sql.set_raw_config_int(context, "dbversion", 67).await?;
|
||||||
}
|
}
|
||||||
|
if dbversion < 68 {
|
||||||
|
info!(context, "[migration] v68");
|
||||||
|
// the index is used to speed up get_fresh_msg_cnt(), see comment there for more details
|
||||||
|
sql.execute(
|
||||||
|
"CREATE INDEX IF NOT EXISTS msgs_index7 ON msgs (state, hidden, chat_id);",
|
||||||
|
paramsv![],
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
sql.set_raw_config_int(context, "dbversion", 68).await?;
|
||||||
|
}
|
||||||
|
|
||||||
// (2) updates that require high-level objects
|
// (2) updates that require high-level objects
|
||||||
// (the structure is complete now and all objects are usable)
|
// (the structure is complete now and all objects are usable)
|
||||||
|
|||||||
Reference in New Issue
Block a user