У меня есть приложение Rails, работающее на Heroku. У меня есть маршрут, ведущий к «домашней» контроллера и „действия ПРЕДЛОЖЕНИЙ“:Повысить производительность для загрузки 3000 записей с помощью Rails?
Rails.application.routes.draw do
get 'listings', to: 'home#listings'
end
Мой список действий:
class HomeController < ApplicationController
def listings
render json: MultiJson.dump({listings:Listing.all})
end
...
end
У меня есть таблица Тэг, содержащий 3000 записей Схема для. Перечисления стол:
create_table "listings", force: :cascade do |t|
t.integer "user_id", null: false
t.boolean "deleted", default: false, null: false
t.string "rent", null: false
t.string "deposit", null: false
t.string "availability", null: false
t.string "min_duration", null: false
t.string "male_count", null: false
t.string "female_count", null: false
t.string "longitude", null: false
t.string "latitude", null: false
t.string "location"
t.string "comments"
t.string "photos"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Когда запускаются 'Heroku журналы' Я вижу это:
Started GET "/listings.json" for 108.6.235.199 at 2015-07-06 14:08:02 +0000
Processing by HomeController#listings as JSON
Parameters: {"home"=>{}}
Listing Load (34.3ms) SELECT "listings".* FROM "listings"
Completed 200 OK in 3717ms (Views: 0.3ms | ActiveRecord: 40.4ms)
Нормально ли это для 3,7 секунд для загрузки и рендеринга 3000 записей через json? Есть ли способ повысить производительность до порядка 100 миллисекунд? Почему это время ActiveRecord составляет 40.ms, а Views - 0,3 мс, но Completed is 3717ms? Было бы лучше использовать MongoDB вместо Postgres для хранения и загрузки записей со скоростью?
Сначала вы должны узнать, какой слой добавляет накладные расходы. Что происходит, когда вы запускаете 'explain analysis select * из списков' в своем SQL-клиенте? Для чего это время выполнения? Он измеряет время выполнения запроса на стороне ** сервера **, исключая любые служебные данные сети или интерфейса. –
Попробуйте поместить эти 3k записи HARDCODED в массив в вашем контроллере и посмотреть, сколько времени потребуется для его рендеринга. Это не вопрос производительности db. Для объектов 3k требуется время. – xlembouras
Я хотел бы предложить вам начать использовать какую-то разбивку на страницы на стороне сервера. Почему вы когда-нибудь захотите отправить столько данных клиенту в любом случае? – Frost