🔖 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:
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user