feat: optimize SQLite PRAGMAs (WAL, mmap 256MB, cache 32MB, temp_store) and add compound indexes
This commit is contained in:
@@ -200,15 +200,32 @@
|
||||
---
|
||||
|
||||
### 9. 🗄️ Тюнинг SQLite PRAGMA и составных индексов
|
||||
- [ ] В [`app/database.py`](file:///home/ai-projects/services/study.qpid.pro/app/database.py):
|
||||
- Вынести `PRAGMA journal_mode=WAL;` в `init_db()` (убрать избыточный вызов при каждом запросе).
|
||||
- Включить параметры производительности памяти Linux:
|
||||
- [x] В [`app/database.py`](file:///home/ai-projects/services/study.qpid.pro/app/database.py):
|
||||
- Вынесен `PRAGMA journal_mode=WAL;` в однократную инициализацию `init_db()` и миграции (устранены повторные блокировки и запись заголовка файла на каждый HTTP-запрос).
|
||||
- Включены высокопроизводительные параметры памяти Linux для каждого соединения:
|
||||
```python
|
||||
conn.execute("PRAGMA synchronous = NORMAL;")
|
||||
conn.execute("PRAGMA mmap_size = 268435456;") # 256MB mmap
|
||||
conn.execute("PRAGMA cache_size = -32000;") # 32MB cache
|
||||
conn.execute("PRAGMA mmap_size = 268435456;") # 256MB memory-mapped I/O
|
||||
conn.execute("PRAGMA cache_size = -32000;") # 32MB RAM page cache
|
||||
conn.execute("PRAGMA temp_store = MEMORY;") # временные таблицы и сортировки в ОЗУ
|
||||
conn.execute("PRAGMA foreign_keys = ON;")
|
||||
```
|
||||
- [ ] Обеспечить Zero-copy чтение страниц БД ядром Linux.
|
||||
- [x] **Zero-copy чтение страниц**: включён `mmap_size = 256MB`, позволяющий ядру Linux отдавать страницы SQLite напрямую из системного дискового кэша без лишних системных вызовов `read()` и копирования в буферы пользовательского пространства.
|
||||
- [x] **Составные индексы (Composite Indexes)** для ускорения частых выборок:
|
||||
- `vocabulary_cards`:
|
||||
- `idx_vocab_user_created ON (user_id, created_at DESC)` — мгновенная пагинация списка слов без сортировки в памяти.
|
||||
- `idx_vocab_user_srs_state ON (user_id, srs_state, srs_next_review)` — выборка очереди интервальных повторений SRS (`/api/srs/queue`).
|
||||
- `idx_vocab_user_srs_created ON (user_id, srs_state, created_at DESC)` — выборка новых слов для интервального повторения.
|
||||
- `idx_vocab_collection ON (user_id, collection)` — мгновенная фильтрация по коллекциям.
|
||||
- `idx_vocab_user_term_nocase ON (user_id, term COLLATE NOCASE)` — предотвращение дубликатов за $O(\log N)$.
|
||||
- `srs_logs`:
|
||||
- `idx_srs_card ON (card_id)` — устранение full table scan при каскадном удалении карточек (`ON DELETE CASCADE`).
|
||||
- `idx_srs_reviewed ON (user_id, reviewed_at)` — выборка журнала повторений и расчёт тепловой карты активности.
|
||||
- `books`:
|
||||
- `idx_books_user_updated ON (user_id, updated_at DESC)` — сортировка списка книг библиотеки по дате чтения.
|
||||
- `sessions`:
|
||||
- `idx_sessions_user ON (user_id)` — ускорение валидации сессий и каскадной очистки.
|
||||
- [x] Добавлен регрессионный тест `test_sqlite_pragma_tuning_and_composite_indexes` в `tests/test_api.py` (23/23 тестов успешно).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user