Связаться с поддержкой

Мы отвечаем по электронной почте, обычно в течение двух дней.

Для защиты от злоупотреблений Google reCAPTCHA проверяет эту отправку; при этом данные передаются в Google. Скрипт загружается только при открытии этой формы.

← Все записи

Когда индекс делает всё медленнее

У таблицы с дневными цифрами один ключ: счётчик и дата вместе. Пять мест в коде задают ей другой вопрос — не «этот счётчик во времени», а «все счётчики в эти дни». Галерея на главной, топ-лист, карта сайта, график за 90 дней и цифры состояния. Без индекса на столбце даты каждый из них читает все 114 113 строк.

Этот индекс делает галерею в десять раз быстрее. Его не добавили. Вот измерение, которое это решило.

галерея, один день — с 61,5 до 6,1 мс топ-лист, 30 дней — с 88,6 до 89,2 мс карта сайта, 14 дней — с 79,6 до 94,8 мс график за 90 дней — с 120,0 до 109,2 мс цифры состояния, 365 дней — с 204,9 до 225,1 мс верхняя полоса без индекса, нижняя с ним вместе: 555 мс становятся 524 мс

Один запрос стал намного быстрее

Галерея спрашивает счётчики, у которых сегодня были обращения. Без индекса на дате она проходит всю таблицу; с индексом находит одну дату и читает 443 строки. Из 61,5 миллисекунды вышло 6,1. Это не тонкий результат, и будь это единственным, что измеряли, индекс сейчас стоял бы в базе.

Два запроса стали медленнее

Карта сайта спрашивает четырнадцать дней и замедлилась на 19 %. Цифры состояния спрашивают год и замедлились на 10 %. В обоих случаях планировщик перешёл с первичного ключа на новый индекс и выбрал хуже.

Вот часть, которую стоит понять, потому что это не ошибка планировщика. Читать диапазон через вторичный индекс значит: найти подходящие строки в индексе и достать каждую из таблицы. Для узкого куска это выгодно. Для четырнадцати дней из тринадцати месяцев это по-прежнему много строк, доставаемых поодиночке, и прямой проход по таблице — чтение в физическом порядке, который любят диски и кеши — побеждает. Планировщик этого не знает. Он видит диапазон и индекс и берёт его.

Нельзя сказать «используй этот индекс только для галереи». Индекс доступен любому запросу, который трогает столбец, и планировщик возьмёт его везде, где его оценки так подскажут. Добавить индекс — это изменение во всех запросах к этой таблице, а не в том одном, который имели в виду.

Вместе: ничего

По всем пяти 555 миллисекунд стали 524. Улучшение в 1,1 раза, которое на Raspberry Pi, и без того отдающем эти страницы из кеша, не стоит изменения схемы.

График за 90 дней выглядит улучшившимся на 9 %. Он не засчитан, и стоит сказать почему. Каждый запрос измеряли трижды: без индекса, с индексом, потом снова без. Если второй прогон без индекса не ложится рядом с первым, разницу дала машина, а не изменение. У графика за 90 дней два прогона без индекса разошлись на 13,8 % — больше, чем эффект, который бы утверждался. Значит, эта строка не измеряет ничего, и как ничто она и подаётся.

Как измеряли и почему это важно

Не на работающей таблице. Скрипт делает копию, работает на копии и в конце её удаляет. Добавить индекс к боевой таблице, чтобы посмотреть, что будет, можно один раз на каждую неожиданность.

Запросы настоящие, взяты из кода, вместе с соединением с таблицей счётчиков. Более ранняя версия этой проверки использовала упрощённую замену и дала куда более воодушевляющий ответ: в двадцать раз быстрее. Этот упрощённый запрос никто не выполняет.

Какое число получилось бы

Измеряй мы обычным способом — взять запрос, который кажется медленным, засечь до и после — ответ был бы «в десять раз быстрее, ставим». Индекс бы вошёл, галерея бы ускорилась, карта сайта и страница состояния замедлились бы, и никто бы не связал одно с другим, потому что на эти две никто не смотрел.

Такова общая форма дела. Изменение в общей инфраструктуре нельзя оценивать по случаю, который его вызвал. Вопрос не «помогает ли это тому, на что я смотрю», а «что ещё оно трогает и что с тем станет».

Есть вариант, который мог бы сработать: индекс с обоими столбцами, дата первой, чтобы галерею можно было ответить из одного индекса, не возвращаясь в таблицу. Возможно, он и не соблазнит планировщик на широких диапазонах. Это не измерено, значит, это не рекомендация — это следующее, что ляжет на копию.

Реклама