Laravel Лучший способ повысить производительность поиска в большой коллекции - PullRequest
0 голосов
/ 19 июня 2020

У меня есть 4 таблицы:

  • объявления (id, name, type_id, city_id)
  • типы (id, slug, name)
  • города (id , slug, name) (37000 записей)
  • состояния (id, slug, name) (120 записей)

У меня может быть URL-адрес, подобный этому: https://example.com/ad , тип, город. html или так: https://example.com/ad, тип, штат. html

Мне нужно сделать фильтр поисковой рекламы по слагам и я Я делаю вот так, чтобы мои объявления фильтровались:

$slugs = explode(',', $slugs);
$ads = Ad::where('is_active', true)->get();

foreach ($slug as slug){

    $types = Type::all();
    if ($types->contains('slug', $slug)) {
        $type = $types->first(function ($value) use ($slug) {
        return $value->slug == $slug;
    });

    $ads = $ads->where('type_id', $type->id);

    $cities = City::all();
    if ($cities->contains('slug', $slug)) {
        $city = $cities->first(function ($value) use ($slug) {
        return $city->slug == $slug;
    });

    $ads = $ads->where('city_id', $city->id);

    $states = State::all();
    if ($states->contains('slug', $slug)) {
        $state = $states->first(function ($value) use ($slug) {
        return $state->slug == $slug;
    });

    $ads = $ads->where('state_id', $state->id);

}

return $ads;
}

Это работает. Но так как у меня много городов, это может быть медленным (от 1 до 2 секунд). Как я могу это улучшить? Я думал использовать кеш, например memcached, чтобы разместить на нем города, но результат не так сильно изменился. Может так я его построил кто не прав?

1 Ответ

2 голосов
/ 19 июня 2020

1) Циклы : ваши Type, City и State модальные окна не будут меняться для каждого l oop. Лучше запросить их перед этим.

$types = Type::all();
$cities = City::all();
$states = State::all();

foreach ($slug as slug) {

2) Кэш : Кеширование для этих трех модальных окон кажется подходящим.

3) Поскольку я не хочу повторить go через эту ветку на как оптимизировать . В нем говорится о правильном использовании select () , Indexing , типов данных и некоторых других.

Держите меня в курсе в комментариях ниже. Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...