From 450a4b062fb8dc96655ea5ba3e44746134042da7 Mon Sep 17 00:00:00 2001 From: Bjoern Welker Date: Fri, 6 Feb 2026 08:16:30 +0100 Subject: [PATCH] perf: add database indexes for better query performance Indexes added: - items.artikel - frequently searched/filtered - items(artikel, groesse) - unique article/size lookup - orders.done - order completion filter - orders.canceled - order cancellation filter - orders(done, canceled) - combined status filter for "open orders" - ausbuchungen.item_id - foreign key for JOINs All indexes use IF NOT EXISTS for idempotent execution. This improves performance for: - Article search/filtering in admin interface - Order status filtering - Stock movement queries Co-Authored-By: Claude Sonnet 4.5 --- wawi/app.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/wawi/app.py b/wawi/app.py index 57f177c..3624f8c 100755 --- a/wawi/app.py +++ b/wawi/app.py @@ -160,6 +160,7 @@ def init_db() -> None: ensure_price_column(db) ensure_image_column(db) ensure_orders_columns(db) + ensure_indexes(db) ensure_admin_user(db) @@ -200,6 +201,26 @@ def ensure_orders_columns(db: sqlite3.Connection) -> None: db.commit() +def ensure_indexes(db: sqlite3.Connection) -> None: + """Erstellt Indizes für bessere Query-Performance (idempotent).""" + # Index für items.artikel (häufig gesucht/gefiltert) + db.execute("CREATE INDEX IF NOT EXISTS idx_items_artikel ON items(artikel)") + + # Index für items(artikel, groesse) für eindeutige Zuordnung + db.execute("CREATE INDEX IF NOT EXISTS idx_items_artikel_groesse ON items(artikel, groesse)") + + # Index für orders.done und orders.canceled (Filter "offene Bestellungen") + db.execute("CREATE INDEX IF NOT EXISTS idx_orders_done ON orders(done)") + db.execute("CREATE INDEX IF NOT EXISTS idx_orders_canceled ON orders(canceled)") + db.execute("CREATE INDEX IF NOT EXISTS idx_orders_status ON orders(done, canceled)") + + # Index für ausbuchungen.item_id (Foreign Key, JOINs) + db.execute("CREATE INDEX IF NOT EXISTS idx_ausbuchungen_item_id ON ausbuchungen(item_id)") + + db.commit() + logger.info("Datenbank-Indizes überprüft/erstellt") + + @app.before_request def ensure_db() -> None: """Stellt sicher, dass DB/Schema einmal pro Worker initialisiert ist."""