🔖 bump version to v0.3.47

- Update Cargo.lock packageversion
- Refactor DB initialization: move PRAGMA settings after table creation for correctness and clarity (WAL, cache size etc.)
- Add foreign key enforcement (`PRAGMAforeign_keys = ON`)
>- Reorder index creation to follow table definition
- Add new indexes: `idx_asset_last_used`, idx`_asset_hits`
>- Introduce indexed lazy_pk support with unique constraint on non-NULL values
> - Improve LRU index to use ASC ordering for efficient oldest-record lookup
This commit is contained in:
2026-04-10 00:03:31 +02:00
parent b5b6becb25
commit b0e24c3b3c
2 changed files with 31 additions and 34 deletions

2
Cargo.lock generated
View File

@@ -4,7 +4,7 @@ version = 4
[[package]] [[package]]
name = "PMOMusic" name = "PMOMusic"
version = "0.3.46" version = "0.3.47"
dependencies = [ dependencies = [
"axum 0.8.7", "axum 0.8.7",
"console-subscriber", "console-subscriber",

View File

@@ -153,33 +153,9 @@ impl DB {
}; };
let conn = Connection::open(path)?; let conn = Connection::open(path)?;
conn.execute_batch( conn.execute("PRAGMA foreign_keys = ON", [])?;
"
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = -32768;
PRAGMA temp_store = MEMORY;
PRAGMA mmap_size = 268435456;
",
)?;
// Index qui MANQUAIT sur les bases existantes:
// Ceci s'exécutera TOUT LE TEMPS, pas seulement à la création
conn.execute(
"CREATE INDEX IF NOT EXISTS idx_metadata_key_value ON metadata (key, value)",
[],
)?;
conn.execute(
"CREATE INDEX IF NOT EXISTS idx_asset_last_used ON asset (last_used DESC)",
[],
)?;
conn.execute(
"CREATE INDEX IF NOT EXISTS idx_asset_hits ON asset (hits DESC)",
[],
)?;
// 1. CRÉATION DES TABLES EN PREMIER
conn.execute( conn.execute(
"CREATE TABLE IF NOT EXISTS asset ( "CREATE TABLE IF NOT EXISTS asset (
pk TEXT PRIMARY KEY, pk TEXT PRIMARY KEY,
@@ -205,21 +181,30 @@ impl DB {
[], [],
)?; )?;
// Créer un index sur la collection pour les requêtes rapides // 2. Optimisations SQLite pour production
conn.execute_batch(
"
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = -32768;
PRAGMA temp_store = MEMORY;
PRAGMA mmap_size = 268435456;
",
)?;
// 3. CRÉATION DES INDEX APRÈS LES TABLES
conn.execute( conn.execute(
"CREATE INDEX IF NOT EXISTS idx_asset_collection "CREATE INDEX IF NOT EXISTS idx_asset_collection
ON ASSET (collection)", ON ASSET (collection)",
[], [],
)?; )?;
// Créer un index composite pour optimiser la politique LRU (get_oldest)
conn.execute( conn.execute(
"CREATE INDEX IF NOT EXISTS idx_asset_lru "CREATE INDEX IF NOT EXISTS idx_asset_lru
ON asset (last_used ASC, hits ASC)", ON asset (last_used ASC, hits ASC)",
[], [],
)?; )?;
// Crée un index composite pour rendre unique les ids si défini dans une collection
conn.execute( conn.execute(
"CREATE UNIQUE INDEX "CREATE UNIQUE INDEX
IF NOT EXISTS asset_collection_id_unique IF NOT EXISTS asset_collection_id_unique
@@ -228,20 +213,32 @@ impl DB {
[], [],
)?; )?;
// Index sur metadata(key, value) pour rendre get_pk_by_origin_url efficace.
// Sans cet index, la requête WHERE key = 'origin_url' AND value = ? fait
// un full scan car la PRIMARY KEY est (pk, key).
conn.execute( conn.execute(
"CREATE INDEX IF NOT EXISTS idx_metadata_key_value ON metadata (key, value)", "CREATE INDEX IF NOT EXISTS idx_metadata_key_value ON metadata (key, value)",
[], [],
)?; )?;
// LAZY PK SUPPORT: Index sur lazy_pk pour lookups rapides (lazy_pk → real pk) conn.execute(
"CREATE INDEX IF NOT EXISTS idx_asset_last_used ON asset (last_used DESC)",
[],
)?;
conn.execute(
"CREATE INDEX IF NOT EXISTS idx_asset_hits ON asset (hits DESC)",
[],
)?;
conn.execute( conn.execute(
"CREATE INDEX IF NOT EXISTS idx_asset_lazy_pk ON asset (lazy_pk)", "CREATE INDEX IF NOT EXISTS idx_asset_lazy_pk ON asset (lazy_pk)",
[], [],
)?; )?;
conn.execute(
"CREATE UNIQUE INDEX IF NOT EXISTS idx_asset_lazy_pk_unique
ON asset (lazy_pk) WHERE lazy_pk IS NOT NULL",
[],
)?;
// Index unique sur lazy_pk (non-NULL) pour éviter les doublons // Index unique sur lazy_pk (non-NULL) pour éviter les doublons
// Un lazy_pk ne peut pointer que vers un seul entry // Un lazy_pk ne peut pointer que vers un seul entry
conn.execute( conn.execute(