Медленный hasMany viaTable

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Ro7
Сообщения: 71
Зарегистрирован: 2013.08.17, 15:08

Медленный hasMany viaTable

Сообщение Ro7 »

Quote - цитаты
QuoteTag - теги
quote_tag_x_quote - связующая таблица

Модель QuoteTag имеет метод:

Код: Выделить всё

    //выбрать все цитаты тега
    public function getQuotes(){
        return $this->hasMany(Quote::className(), ['id' => 'quote_id'])
                    ->viaTable('quote_tag_x_quote', ['tag_id' => 'id']);
    } 

Контроллер:

Код: Выделить всё

$oTag = QuoteTag::find()->where('alias = :tag', [':tag' => $tag])->one();
$data = $oTag->getQuotes()->select('id')->one(); 
getQuotes почему-то работает очень медленно. В оригинале у меня ActiveDataProvider и кеширование. Но точно так же, как и в примере выше, запросы к базе отрабатывают нормально, а вот ожидание обработки/отдачи по 16 сек.
//В связующей таблице 239284 записей. Цитат у тега из примера 11923;
см. Скриншот
Вложения
yii.jpg
yii.jpg (66.21 КБ) 4176 просмотров
arlamar
Сообщения: 39
Зарегистрирован: 2013.07.20, 17:38

Re: Медленный hasMany viaTable

Сообщение arlamar »

Ну, во втором запросе просто выборка с лимитом, а в первом явно есть условие и, смею предположить, что индексов нет иначе объяснения таким цифрам быть не может.
Ro7
Сообщения: 71
Зарегистрирован: 2013.08.17, 15:08

Re: Медленный hasMany viaTable

Сообщение Ro7 »

Индексы есть. Ко времени работы db вопросов нет. Вопрос к другому времени... обработки/отдачи случае использования hasMany-viaTable.... когда запросы в базе 40мс, а общее время 16 секунд. И для примера второй запрос, где возвращается из базы такой же объем данные и более менее приличное время обработки против первого.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Медленный hasMany viaTable

Сообщение samdark »

Покажите профайлер.
Ro7
Сообщения: 71
Зарегистрирован: 2013.08.17, 15:08

Re: Медленный hasMany viaTable

Сообщение Ro7 »

Сразу не заметил.. При использование такого кеширования происходит что-то странное со временем.

Полный код контроллера:

Код: Выделить всё

    public function actionViewQuotes($tag)
    {
        $oTag = QuoteTag::find()->where('alias = :tag', [':tag' => $tag])->one();

        $dataProvider = new ActiveDataProvider([
            'query' => $oTag->getQuotes()->with(['tags', 'source']),
            'sort' => [
                'defaultOrder' => [
                    'ratio' => SORT_DESC
                ]
            ]
        ]);

        Yii::$app->db->cache(function() use($dataProvider){
            $dataProvider->prepare();
        }, 180);

        return $this->renderContent('render test');
        //return $this->render('view-quotes', ['dataProvider' => $dataProvider, 'model' => $oTag]);
    } 
Profiling (приложен)
Logs: https://yadi.sk/i/fU1zuxafe5thV
Вложения
Profiling
Profiling
yii2-11.png (186.87 КБ) 4060 просмотров
arlamar
Сообщения: 39
Зарегистрирован: 2013.07.20, 17:38

Re: Медленный hasMany viaTable

Сообщение arlamar »

Прошу прощения за моё любопытство, но хочу спросить, как долго выполняется запрос SELECT * FROM quote WHERE id IN (100500 айдишников)?
Сейчас делаю довольно сложный проект и всячески пытался избегать таких огромных запросов и порой сделать это было очень сложно. Может я зря старался?)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Медленный hasMany viaTable

Сообщение samdark »

arlamar, создавайте отдельную тему. Ваш вопрос к этой отношения не имеет.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Медленный hasMany viaTable

Сообщение samdark »

Очень странно. Запросы действительно ничего не скушали. Между ними тоже дыр в логе нет. Без какого-нибудь XDebug найти что тормозит, думаю, не выйдет.
Ответить