intermediate
Indexes
Проектируйте clustered primary keys, secondary indexes, left-prefix usage и covering indexes вокруг реальных query patterns.
Индексы InnoDB — B+ деревья. Первичный ключ — clustered index; строки таблицы лежат в порядке PK. Листья вторичных индексов хранят значения PK — double lookup, если колонки не покрыты.
-- Правило левого префикса: (a, b, c) помогает WHERE a=? AND b>?, но не WHERE b=? alone
CREATE INDEX idx_orders_customer_status ON orders (customer_id, status, created_at);
-- Covering index без обращения к таблице
CREATE INDEX idx_orders_cover ON orders (customer_id, status, total);
EXPLAIN SELECT total FROM orders
WHERE customer_id = 10 AND status = 'paid';
-- possible: Using index
PK должен быть узким и дружелюбным к вставкам (auto-increment или time-ordered UUID). Случайный UUID PK фрагментирует clustered index. Проверяйте `EXPLAIN` и `SHOW INDEX`.
На интервью: clustered vs secondary; left-prefix; covering indexes; почему выбор PK влияет на write amplification.
Типовые ошибки: широкие composite без совпадения префикса; дублирующие индексы; UUID v4 как PK на огромных таблицах; игнор `Using filesort` в EXPLAIN.
Компромисс — быстрые чтения через covering indexes против больших индексов и более медленных insert/update по clustered key.
Чеклист:
- Порядок composite под WHERE и ORDER BY.
- Covering indexes для горячих read paths.
- Монотонный clustered PK, где возможно.
- Удаляйте неиспользуемые индексы после разбора slow queries.