Re Q1 ... Оптимизатор запросов иногда предпочитает сканировать таблицу, даже если существует «совершенно хороший» индекс.Этот компромисс основан на сложном алгоритме, но, как правило:
Если необходимо использовать более ~ 20% индекса, считается более эффективным игнорировать индекс и просто сканироватьtable.
Причина в следующем: использование индекса означает сканирование индекса BTree (который очень похож на таблицу), а затем перепрыгивание на данные BTree для поиска записи.Этого назад и вперед избегают, если он просто сканирует данные.Недостатком является то, что ему нужно игнорировать до 80% строк.
Следствие: не беспокойтесь о индексировании «флагов» (0/1, T / F, M / F, Yes / No) илистолбцы с низкой кардинальностью (да / нет / возможно, M / F / и т. д., день недели, ...).
С другой стороны, может быть очень полезно иметь составной индекс, начинающийся со столбца с низкой мощностью:
WHERE deleted=0 AND created_at > NOW() - INTERVAL 1 DAY
INDEX(deleted, created_at)