Принудительный запрос раздела с использованием Laravel

#laravel #partition

#laravel #раздел

Вопрос:

Привет, в настоящее время я пишу запрос, в котором я хотел бы принудительно выполнить раздел, используемый запросом. Я знаю, что этот код работает в MySQL, но я не знаю, как бы я написал это с помощью laravel.

Это код MySQL, который я бы использовал для принудительного разделения

 PARTITION (p46)
  

Я пытался написать следующее в Laravel, но, похоже, это не работает

 ->raw('PARTITION (p46)')
  

Я не уверен, что raw есть ли вообще метод, который вы можете использовать в laravel, поэтому он, вероятно, не работает.

Я использую это принудительное выполнение раздела вместо использования приведенного ниже кода, это значительно ускоряет мои запросы.

 ->where('venue_id', 46)
  

Моя таблица использует раздел HASH(venue_id) , и я попытался использовать код MySQL, и это работает отлично.

Заранее благодарю вас, если у вас есть решение для этого, я нигде не смог найти, которое объясняет, как это сделать.


Вот мой полный запрос laravel, чтобы дать вам некоторый контекст:

 $bodyVisitors->selectRaw('SUM(visitors_new) AS new, SUM(visitors_total) AS total')
         ->raw('PARTITION (p' . $venue_filter . ')')
         ->where('day_epoch', '>=', $body_start)
         ->where('day_epoch', '<', $body_end)
         ->get();
  

->raw() Игнорируется, есть ли способ заставить это работать? Я в порядке, если ответ отрицательный, я просто перестану использовать laravel для написания этих запросов.

Комментарии:

1. Какая версия MySQL? Эта функция не существовала до версии 5.6.2.

Ответ №1:

Я также целый день страдаю от проблемы с разделением…

Способ, которым я решаю, заключается в

выберите максимальную временную метку и максимальный идентификатор для T1, затем соедините ее левой кнопкой мыши с T2 на T1.временная метка и идентификатор

Надеюсь, что мое предложение окажет некоторую помощь…

Я все еще пишу сценарий eloquent, почти готовый:'(

Ответ №2:

Попробуйте подобное в вашей модели Eloquent:

 $table = $this->getConnection()->getTablePrefix() . $this->getTable();
$table .= ' PARTITION ({your partition})';
$this->newQuery()->from($table)->where()->get();
  

это будет выполнять запрос, подобный этому:

select * from table PARTITION (xxxxxx) where

Ответ №3:

Попробуйте добавить эту область

     {
        $query->from($partition);
    }
  

и $partition — это имя вашего раздела. Попробуйте $partition = 'p46' в вашем случае