Ускорить views

Главные вкладки

Аватар пользователя marat M marat M 7 марта в 20:06

Вопрос к знатокам алгоритма работы вьюсов.
Есть вьюс, он должен выбрать из обширной базы и показать X последних статей по некоему критерию фильтрации.
Кол-во "X" указано в настройках вьюса: "Постраничный навигатор"->"Отображать указанное количество элементов".
Вопрос: будет ли вьюс шерстить ВСЮ базу, выбирать кучу статей по фильтру, и только потом выводить X из них? Или вьюс остановит перебор сразу, как только наберется X подходящих статей, и покажет их?

Комментарии

Аватар пользователя jura12 jura12 9 марта в 9:05

борьба за производительность сервера на VDS в одном проекте еще не закончена. победа слагается из комплекса мер. может напишу потом список.
по поводу mysql tuner. скачиваете перл утилиту и запускаете в рут режиме. она сама определяет необходимое изменение конфигурации и предлагает их внести. вносите в их в файл /etc/mysql/mariadb.conf.d/jura.cnf . у меня mariadb, 20gb озу. например следующее содержимое:

[mysqld]

join_buffer_size = 8M
innodb_buffer_pool_size=13G

performance_schema=ON
#skip-name-resolve=ON

table_definition_cache=800
innodb_log_file_size=3G
innodb_log_buffer_size=20M

log_error = /var/log/mysql/error.log
slow_query_log_file    = /var/log/mysql/mariadb-slow.log

max_connections=152
wait_timeout=600
interactive_timeout=600

перегрузите базу и убедитесь что она не упала. после этого БД меньше обращается к диску, максимально использует память и как следствие быстрее работает.

Аватар пользователя bsyomov bsyomov 9 марта в 18:29
1

Крайне не рекомендую слепо следовать этим рекомендациям не понимая, что меняется и зачем.
Это совсем не кнопка "сделай хорошо". А как и различные pagespeed, и подобные инструменты, это набор общих рекомендаций, исполнение которых, в определённых условиях, может помогать, может не помочь вообще в конкретной ситуации, а может сделать даже хуже в определённых ситуациях.

Например, такой здоровый innodb_log_file_size не часто нужен в принципе. innodb_buffer_pool_size делать такого объёма, возможно, тоже не нужно в вашем случае, даже если базы суммарно в вас и больше и.т.п.

Аватар пользователя jura12 jura12 9 марта в 18:49

как говорил тов. Сталин «Нет у меня для Вас других писателей». так и здесь. mysql старая программа и не может сама оптимизировать использование ресурсов компьютера а компьютеры эволюционировали значительно. при стандартном использовании у меня БД занимала 1,5gb-2gb памяти и часто обращалась к диску. я уменьшил саму БД и увеличил использование памяти до 13gb. примерно до 70%.
когда мер не хватает можно почитать официальную документацию: Optimization and Tuning и Profiling with MariaDB Xpand, MariaDB Memory Allocation.
Все требует долгого квалифицированного и научного подхода. но на не денежных проектах это затруднительно.

Аватар пользователя jura12 jura12 10 марта в 9:04

вот мои изыскания и действия по ускорению большого сайта на vds:
у вас vds? с ним настраивать приключение еще то.
0. сначала сколько весит главная страница. сохраните и посмотрите. уменьшите размер картинок. имхо сайт 300-1000кб норма.
1. уберите крон . поставьте отработку на ночь через drush. 1 раз в день или 2 раза.
2. отключите стандартные модули статистики, поиска, лога.
3. оптимизируйте БД с помощью mysqltuner
4. посмотрите какой запрос дольше всего отрабатывает программой mytop и выясните какой модуль может его выдавать.
5. облегчите выдачу 404 и 403 ошибок. у меня через смену темы theme switcher
6. если есть вычисляемые поля то computed field то облегчите подсчет.
7. включите в http 2 в http сервере
8. прокрутите через lighthouse что долго грузится. долго грузятся обычно подключение к сторонним сервисам.
9. увеличьте число ядер и памяти на vds
10. наберите в яндексе time to response nginx . следуйте советам.

Аватар пользователя marassa marassa 7 марта в 21:57

Вьюс сам по себе не умеет ни шерстить базу, ни перебирать кучу статей по фильтру. Вьюс передает SQL-серверу ровно один SQL-запрос (его можно посмотреть прямо в определении view в самом низу) и получает от него ответ. Параметры пейджера (LIMIT и OFFSET) включены в этот запрос, так что возвращено будет ровно столько строк, сколько указано в настройках пейджера.
А вот насколько быстро и оптимально будет выполняться этот самый SQL-запрос, зависит от размера базы данных и наличия в ней необходимых индексов для данного запроса.

Аватар пользователя marat M marat M 8 марта в 18:21

Наверное, я не так задал вопрос. Мы указали параметр LIMIT в SQL-запросе. Остановится ли выполнение запроса по достижении лимита, или сначала будет проверена вся база полностью, и только потом вернётся указанное кол-во значений?

Аватар пользователя bsyomov bsyomov 9 марта в 18:35

Очень зависит от запроса. До этого могут происходить разные join и сортировки, которые и составят основную нагрузку которую создаёт запрос...

Советую познакомиться поближе с отладкой sql запросов, начиная с EXPLIAN.

Аватар пользователя marassa marassa 8 марта в 19:19

"it is very important to have ORDER BY with LIMIT executed without scanning and sorting the full result set, so it is important for it to use index – in this case, index range scan will be started, and query execution stopped as soon as the required amount of rows generated"
https://www.percona.com/blog/mysql-order-by-limit-performance-optimization/

Аватар пользователя marat M marat M 10 марта в 13:03

Спасибо, соратники, за участие. Углубляюсь в sql-запросы для начала, если нарою что ценное для общества, отчитаюсь. Не претендуя на большую тему "как ускорить сайт", ставлю задачу "как в админке задать параметры вьюсу, чтобы запрос к БД был оптимальным".