Комментарии 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) и про оценку статистики.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Информация
Дата основания

14 июня 2007

Местоположение

Россия

Численность

501–1 000 человек

Дата регистрации

27 декабря 2019

Блог на Хабре