try to speed up query

This commit is contained in:
polv committed 2026-03-06 22:37:15 +07:00
1 parent dd52b82cc7
commit 7df0ad6066
3 files changed
+56 -20

No files matched your search

+1 -1
View File
@@ -1,7 +1,7 @@
use std::path::PathBuf; use std::path::PathBuf;
pub fn get_db_dir() -> PathBuf { pub fn get_db_dir() -> PathBuf {
PathBuf::from("tmp/save-db") PathBuf::from(r"C:\Users\HP\AppData\Roaming\cc.polv.cjdic2")
} }
pub fn get_vibrato_dict_dir() -> PathBuf { pub fn get_vibrato_dict_dir() -> PathBuf {
+54 -19
View File
@@ -6,7 +6,7 @@ use crate::{
db::{Database, yomitan_writer::normalize_term}, db::{Database, yomitan_writer::normalize_term},
}; };
#[derive(Serialize, Debug)] #[derive(Serialize, Debug, Clone)]
pub struct YomitanRow { pub struct YomitanRow {
term: String, term: String,
reading: String, reading: String,
@@ -56,10 +56,55 @@ impl YomitanDatabase {
new_t.push_str(&normalize_term(&new_seg)); new_t.push_str(&normalize_term(&new_seg));
let q_term_norm = new_t; let q_term_norm = new_t;
let conn = self.db.conn.lock().unwrap();
// TODO: consider using = if not GLOB string conn.execute_batch(
let sql = format!( "
r#" CREATE TEMP TABLE IF NOT EXISTS yomitan_lookup_keys (
term,
reading,
score,
title,
glossary_id,
def_tags_id,
rules_id,
term_tags_id,
sequence
);
DELETE FROM yomitan_lookup_keys;
",
)?;
// let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading));
conn.execute(
&format!(
"
INSERT INTO yomitan_lookup_keys
SELECT
t.term,
t.reading,
t.score,
d.title,
t.glossary_id,
t.def_tags_id,
rules_id,
term_tags_id,
sequence
FROM yomitan.terms t
JOIN yomitan.view_terms_term_rank tr ON tr.term = t.term AND tr.reading = t.reading
JOIN yomitan.dictionaries d ON d.id = t.dict_id
WHERE t.term_norm GLOB ?1 {} t.reading GLOB ?2
ORDER BY tr.max_score DESC, d.sort_order DESC
LIMIT ?3 OFFSET ?4
",
and_or
),
params![q_term_norm, q_reading, limit, offset],
)?;
// let _timer = Timer::new(format!("search_yomitan: {} {}", q_term, q_reading));
let mut stmt = conn.prepare(
"
SELECT SELECT
t.term, t.term,
t.reading, t.reading,
@@ -69,25 +114,15 @@ impl YomitanDatabase {
g.content AS glossary_json, g.content AS glossary_json,
t.sequence, t.sequence,
COALESCE(tt.tags, '') AS term_tags, COALESCE(tt.tags, '') AS term_tags,
d.title AS dict_title t.title AS dict_title
FROM yomitan.terms t FROM yomitan_lookup_keys t
JOIN yomitan.view_terms_term_rank tr ON tr.term = t.term AND tr.reading = t.reading
JOIN yomitan.glossaries g ON g.id = t.glossary_id JOIN yomitan.glossaries g ON g.id = t.glossary_id
JOIN yomitan.dictionaries d ON d.id = t.dict_id
LEFT JOIN yomitan.def_tag_sets dt ON dt.id = t.def_tags_id LEFT JOIN yomitan.def_tag_sets dt ON dt.id = t.def_tags_id
LEFT JOIN yomitan.rule_sets r ON r.id = t.rules_id LEFT JOIN yomitan.rule_sets r ON r.id = t.rules_id
LEFT JOIN yomitan.term_tag_sets tt ON tt.id = t.term_tags_id LEFT JOIN yomitan.term_tag_sets tt ON tt.id = t.term_tags_id
WHERE t.term_norm GLOB ?1 {} t.reading GLOB ?2 ",
ORDER BY tr.max_score DESC, d.sort_order DESC )?;
LIMIT ?3 OFFSET ?4 let rows = stmt.query_map(params![], |r| {
"#,
and_or
);
let conn = self.db.conn.lock().unwrap();
let mut stmt = conn.prepare(&sql)?;
let rows = stmt.query_map(params![q_term_norm, q_reading, limit, offset], |r| {
Ok(YomitanRow { Ok(YomitanRow {
term: r.get(0)?, term: r.get(0)?,
reading: r.get(1)?, reading: r.get(1)?,
+1
View File
@@ -155,6 +155,7 @@ impl YomitanWriter {
CREATE INDEX IF NOT EXISTS dictionaries_lang ON dictionaries (lang); CREATE INDEX IF NOT EXISTS dictionaries_lang ON dictionaries (lang);
CREATE INDEX IF NOT EXISTS terms_dict_id ON terms (dict_id); CREATE INDEX IF NOT EXISTS terms_dict_id ON terms (dict_id);
CREATE INDEX IF NOT EXISTS terms_term_norm ON terms (term_norm);
CREATE INDEX IF NOT EXISTS terms_reading ON terms (reading); CREATE INDEX IF NOT EXISTS terms_reading ON terms (reading);
CREATE INDEX IF NOT EXISTS terms_term_reading_score ON terms(term, reading, score DESC); CREATE INDEX IF NOT EXISTS terms_term_reading_score ON terms(term, reading, score DESC);