Optimization trips import and render#108
Conversation
| @@ -0,0 +1,3 @@ | |||
| DB_HOST=db | |||
| DB_USER=postgres | |||
| DB_PASSWORD=1q2w3e4r No newline at end of file | |||
There was a problem hiding this comment.
Это файл с примером необходимых переменных окружения, значения из него не грузятся))
| @from = City.find_by_name!(params[:from]) | ||
| @to = City.find_by_name!(params[:to]) | ||
| @trips = Trip.where(from: @from, to: @to).order(:start_time) | ||
| @trips = Trip.where(from: @from, to: @to).order(:start_time).preload(bus: :services).load |
| </h1> | ||
| <h2> | ||
| <%= "В расписании #{@trips.count} рейсов" %> | ||
| <%= "В расписании #{@trips.size} рейсов" %> |
| <% end %> | ||
| </ul> | ||
| <%= render "delimiter" %> | ||
| ==================================================== |
There was a problem hiding this comment.
FYI: есть API для рендеринга коллекций, там можно даже указать шаблон spacer параметром.
https://guides.rubyonrails.org/layouts_and_rendering.html#spacer-templates
Это позволяет находить компромисс между удобством разбиения на partial’ы и не настолько медленно работает как наивный рендеринг в цикле.
| Соответственно импорт файла `large.json` будет выполняться сильно дольше и мы не уложимся в бюджет, следовательно | ||
| необходимо оптимизировать этот процесс. | ||
|
|
||
| Перед внесением изменений я решил покрыть имеющийся функционал тестами чтобы ничего не сломать (см |
| ``` | ||
|
|
||
| `rack-mini-profiler` показывает что наибоьшее время тратится на запрос трипов (выполняется Seq Scan), | ||
| ускорить этот запрос можно добавлением индексов на поля `from_id` и `to_id`. |
There was a problem hiding this comment.
👍 с точки зрения рендеринга именно этой страницы это не супер заметно, но если бы мы подходили с точки зрения снижения нагрузки на БД, это было бы очень полезно
| @@ -0,0 +1,5 @@ | |||
| class AddIndexToTrips < ActiveRecord::Migration[5.2] | |||
| def change | |||
| add_index :trips, [:from_id, :to_id] | |||
There was a problem hiding this comment.
лучше не забывать concurrently (strong_migrations не даёт забывать)
| get URI.encode('/автобусы/Самара/Москва') | ||
| assert_response :success | ||
|
|
||
| assert_includes @response.body, 'Автобусы Самара – Москва' |
Время выполнения импорта файла
fixtures/large.jsonменее 30 секунд:Время рендера страницы
автобусы/Самара/Москвапосле загрузки файлаlarge.jsonоколо 200 мс: