Почему один и тот же select к mysql-представлению на двух идентичных системах показывает существенно разные тайминги?
Столкнулся с такой проблемой.
Вели доработки на dev-копии сайта, размещенной на локальном компе с mysql 8 на mac os hs
В частности создали сложный mysql-view с несколькими join'ами и с порядка 250k строками
Локально select * отрабатывает за ~300 мс, но когда перенесли на продакшн-сервер обнаружили, что тот же select по той же вьюхе отрабатывает за 40+ секунд!
Затем мы для эксперимента развернули копию базы на другом локальном компе, но уже с mysql 5.7 и получили точно такие же плохие результаты как на продакшне.
Затем обновили на втором компе mysql c 5.7 до 8 развернули копию базу и снова 40+ секунд. Т.е. версия mysql не при чем.
Итого имеем два асболютно одинаковых macbook pro с mysql 8 с разными таймингами 0,3 сек против 40 сек.
Конфиги мускула на двух ноутах идентичные, базы идентичные.
Сергей, конфиги идентичные, нагрузка на оба компа нулевая, маки одинаковые вплоть до установленного софта, ну прям клоны.
Тайминг тестили в phpstorm и в терминале, подумали может шторм кеширует, но нет. Тайминг и там и там одинаковый. Только на одной системе менее секунды, на втором более 30 секунд
Никита Шелковников, я не утверждал, что они разные. Но при отсутствии индексов скорость обработки зависит только от того, в какой последовательности хранятся данные в базе, и при развёртывании последовательность наполнения базы не сохраняется.
Это сугубо моё ИМХО, ибо Вы утверждаете, что во всём ином присутствует полная идентичность.
Так, для эксперимента, разверните эту базу на первом компьютере ну скажем под другим именем, и попробуйте сделать вашу выборку.
Никита Шелковников, хм, в этом случае всё-таки не всё идентично с компьютерами. Видимо на первом установлен какой-то модуль, выполняющий кеширование запросов/обращение к жёсткому диску.
А планы запросов одинаковые? Также проверьте что после развертывания базы, индексы находятся в рабочем состоянии. Возможно после развертывания необходимо попробовать разогреть кеш, а потом производить тестирование.