perf: add indexes and force their use (authors)

This commit is contained in:
Greg Heartsfield 2023-01-15 10:52:49 -06:00
parent 3e7f2e21df
commit fddbf321bc
2 changed files with 39 additions and 7 deletions

View File

@ -524,8 +524,19 @@ fn override_index(f: &ReqFilter) -> Option<String> {
} }
} }
// if there is an author, it is much better to force the authors index. // if there is an author, it is much better to force the authors index.
if let Some(ks) = &f.authors { if let Some(_) = &f.authors {
if f.since.is_none() && f.until.is_none() {
if f.kinds.is_none() {
// with no use of kinds/created_at, just author
return Some("author_index".into()); return Some("author_index".into());
} else {
// prefer author_kind if there are kinds
return Some("author_kind_index".into());
}
} else {
// finally, prefer author_created_at if time is provided
return Some("author_created_at_index".into());
}
} }
None None
} }

View File

@ -20,7 +20,7 @@ pragma mmap_size = 17179869184; -- cap mmap at 16GB
"##; "##;
/// Latest database version /// Latest database version
pub const DB_VERSION: usize = 14; pub const DB_VERSION: usize = 15;
/// Schema definition /// Schema definition
const INIT_SQL: &str = formatcp!( const INIT_SQL: &str = formatcp!(
@ -56,6 +56,8 @@ CREATE INDEX IF NOT EXISTS delegated_by_index ON event(delegated_by);
CREATE INDEX IF NOT EXISTS event_composite_index ON event(kind,created_at); CREATE INDEX IF NOT EXISTS event_composite_index ON event(kind,created_at);
CREATE INDEX IF NOT EXISTS kind_author_index ON event(kind,author); CREATE INDEX IF NOT EXISTS kind_author_index ON event(kind,author);
CREATE INDEX IF NOT EXISTS kind_created_at_index ON event(kind,created_at); CREATE INDEX IF NOT EXISTS kind_created_at_index ON event(kind,created_at);
CREATE INDEX IF NOT EXISTS author_created_at_index ON event(author,created_at);
CREATE INDEX IF NOT EXISTS author_kind_index ON event(author,kind);
-- Tag Table -- Tag Table
-- Tag values are stored as either a BLOB (if they come in as a -- Tag values are stored as either a BLOB (if they come in as a
@ -158,19 +160,15 @@ pub fn upgrade_db(conn: &mut PooledConnection) -> Result<()> {
if curr_version == 1 { if curr_version == 1 {
curr_version = mig_1_to_2(conn)?; curr_version = mig_1_to_2(conn)?;
} }
if curr_version == 2 { if curr_version == 2 {
curr_version = mig_2_to_3(conn)?; curr_version = mig_2_to_3(conn)?;
} }
if curr_version == 3 { if curr_version == 3 {
curr_version = mig_3_to_4(conn)?; curr_version = mig_3_to_4(conn)?;
} }
if curr_version == 4 { if curr_version == 4 {
curr_version = mig_4_to_5(conn)?; curr_version = mig_4_to_5(conn)?;
} }
if curr_version == 5 { if curr_version == 5 {
curr_version = mig_5_to_6(conn)?; curr_version = mig_5_to_6(conn)?;
} }
@ -198,6 +196,9 @@ pub fn upgrade_db(conn: &mut PooledConnection) -> Result<()> {
if curr_version == 13 { if curr_version == 13 {
curr_version = mig_13_to_14(conn)?; curr_version = mig_13_to_14(conn)?;
} }
if curr_version == 14 {
curr_version = mig_14_to_15(conn)?;
}
if curr_version == DB_VERSION { if curr_version == DB_VERSION {
info!( info!(
@ -619,3 +620,23 @@ PRAGMA user_version = 14;
} }
Ok(14) Ok(14)
} }
fn mig_14_to_15(conn: &mut PooledConnection) -> Result<usize> {
info!("database schema needs update from 14->15");
let upgrade_sql = r##"
CREATE INDEX IF NOT EXISTS author_created_at_index ON event(author,created_at);
CREATE INDEX IF NOT EXISTS author_kind_index ON event(author,kind);
pragma optimize;
PRAGMA user_version = 15;
"##;
match conn.execute_batch(upgrade_sql) {
Ok(()) => {
info!("database schema upgraded v14 -> v15");
}
Err(err) => {
error!("update failed: {}", err);
panic!("database could not be upgraded");
}
}
Ok(15)
}