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.