Страница 1 из 1

Как оптимизировать запрос

СообщениеДобавлено: 14 окт 2017, 21:56
vanred79
Здравствуйте! Подскажите пожалуйста возможно ли как то оптимизировать следующий запрос:
Код: Выделить всё
SELECT MAX(valFROM
                
(SELECT MAX(date_updated) as val FROM {{apartment}}
                
UNION
                SELECT date_updated 
as val FROM {{galleries}}) as t

Этот запрос на 100% загружает CPU VPS сервера. Можно ли что то с ним сделать?

Re: Как оптимизировать запрос

СообщениеДобавлено: 16 окт 2017, 09:08
Xpycm
Здравствуйте.

Попробуйте добавить индексы в обе таблицы для полей date_updated

Re: Как оптимизировать запрос

СообщениеДобавлено: 16 окт 2017, 09:42
vanred79
Xpycm писал(а):Здравствуйте.

Попробуйте добавить индексы в обе таблицы для полей date_updated


Добрый день Хруст!
Индексы в полях date_updated стоят в обоих таблицах.

Я немного изменил код RandomapartmentsWidget
Код: Выделить всё
Yii::import('application.modules.apartments.helpers.apartmentsHelper');
$dependency = new CDbCacheDependency('SELECT MAX(id) FROM {{apartment}}');
        
$sql 'SELECT id FROM {{apartment}} WHERE type='.$type.' AND city_id='.$sity.' AND obj_type_id='.$tipob.' '.$num_of_rooms.' '.$price_type.' ';
        
$results Yii::app()->db->cache(param('cachingTime'1209600), $dependency)->createCommand($sql)->queryColumn();
                
shuffle($results);

        
$this->criteria = new CDbCriteria;
        
$this->criteria->addInCondition('t.id'array_slice($results0param('module_apartments_widgetApartmentsItemsPerPageRandom'9)));

        
$result apartmentsHelper::getApartments(param('module_apartments_widgetApartmentsItemsPerPageRandom'9), $this->usePagination0$this->criteria);
        
        if(
$this->count){
            
$result['count'] = $this->count;
        }

        
$this->render('widgetApartments_list'$result); 

где переменные после WHERE берутся из фильтра страниц page.
Все работает, но загрузка CPU 100%. show full processlist показывал, что грузит процессор процесс mysql
Код: Выделить всё
SELECT MAX(valFROM
                
(SELECT MAX(date_updated) as val FROM {{apartment}}
                
UNION
                SELECT date_updated 
as val FROM {{galleries}}) as t

Как думаете, может быть это из за того, что очень много страниц page в таблице ore_menu (порядка 50 тыс.)? Или из этого, что вышестоящий код не правильно сделал?