Pull to refresh

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).

Поэтому я и говорю, про худший случай (у всех товаров цена 1950) и про оценку статистики.

В таблице обозначена одна запись с ценой 1950 (смотрите рисунки).

Поэтому я и говорю, про худший случай (у всех товаров цена 1950) и про оценку статистики.
Sign up to leave a comment.