use combined index (state, hidden, chat_id) to speed up marknoticed_chat()

This commit is contained in:
B. Petersen
2020-10-10 00:32:45 +02:00
parent 2fe600f885
commit 4c8e6ef495
2 changed files with 9 additions and 7 deletions

View File

@@ -1745,11 +1745,12 @@ pub async fn get_chat_msgs(
}
pub async fn marknoticed_chat(context: &Context, chat_id: ChatId) -> Result<(), Error> {
// "WHERE" below uses the index `(state, hidden, chat_id)`, see get_fresh_msg_cnt() for reasoning
if !context
.sql
.exists(
"SELECT id FROM msgs WHERE chat_id=? AND state=?;",
paramsv![chat_id, MessageState::InFresh],
"SELECT id FROM msgs WHERE state=? AND hidden=0 AND chat_id=?;",
paramsv![MessageState::InFresh, chat_id],
)
.await?
{
@@ -1760,10 +1761,11 @@ pub async fn marknoticed_chat(context: &Context, chat_id: ChatId) -> Result<(),
.sql
.execute(
"UPDATE msgs
SET state=13
WHERE chat_id=?
AND state=10;",
paramsv![chat_id],
SET state=?
WHERE state=?
AND hidden=0
AND chat_id=?;",
paramsv![MessageState::InNoticed, MessageState::InFresh, chat_id],
)
.await?;

View File

@@ -1360,7 +1360,7 @@ CREATE INDEX devmsglabels_index1 ON devmsglabels (label);
}
if dbversion < 68 {
info!(context, "[migration] v68");
// the index is used to speed up get_fresh_msg_cnt(), see comment there for more details
// the index is used to speed up get_fresh_msg_cnt() (see comment there for more details) and marknoticed_chat()
sql.execute(
"CREATE INDEX IF NOT EXISTS msgs_index7 ON msgs (state, hidden, chat_id);",
paramsv![],