Comments 7
Вообще-то, если нет covering index, то для чтения всех записей с ценой больше 1950 понадобится не 251 чтение с диска, а, в худшем случае, 10000: 250+9750. Поэтому MySQL производит предварительную оценку статистики, сколько процентов записей данный запрос может вернуть. И иногда делает full table scan вместо использования индекса.
Да, MySQL использует статистику. Но цель рассматриваемого примера в статье — наглядно показать уменьшение количества чтений. И для этого «изобретался» способ решить возникшую проблему. А именно, вынести цены в отдельную табличку index_1, которая помещается на 250 кластерах диска, прочитать ее полностью, найти цену 1950 и по соответствующей ссылке получить данные из основной таблицы. Поэтому в расчетах получили чтение 251 кластера.
Данные лежат на диске. Для их чтения (select *) нужно чтение с диска. В худшем случае — 9750 штук.
Выбор происходит по условию price = 1950. Находим цену в индексе и, если нет covering index, то за данными (select *) будет одно обращение к диску (если в табличке одна запись с ценой 1950).
Как и почему в InnoDB появились индексы на основе В-дерева