Оптимизация запроса с множеством связей

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Оптимизация запроса с множеством связей

Сообщение [email protected] »

собственно ошибка вот такая:
#1317 - Query execution was interrupted

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

$QuerySale = Sale::find();
$QuerySale->from(['s' => Sale::tableName()]);
// присоединяем связи
$QuerySale->joinWith(['agent AS agent']);
$QuerySale->joinWith(['addresses AS address']);
$QuerySale->joinWith(['tags AS tags]');
сами связи

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

  public function getAgent()
    {
        return $this->hasOne(Agents::className(), ['phone' => 'phone1'])->select('person_type', 'status','person');
    }
    public function getAddress()
    {
        return $this->hasOne(Addresses::className(), ['id' => 'id_address'])->select('id', 'address');
       
    }
   public function getTags()
    {
        return $this->hasMany(RealTags::className(), ['sale_id' => 'id'])->select('tag_id');

    }
    
пишет, что виснет на таком запросе (подозреваю что он первый для расчета количества записей dataProvider'a):

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

SELECT COUNT(*) FROM `CITY_sale` `s`
 LEFT JOIN `CITY_agents` `agent` ON `s`.`phone1` = `agent`.`phone` 
 LEFT JOIN `CITY_addresses` `address` ON `s`.`id_address` = `address`.`id` 
 LEFT JOIN `CITY_tags` `tags` ON `s`.`id` = `tags`.`sale_id` 
 WHERE (`date_start` >= 1511867093) 
 AND (`disactive` <> 1)
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Оптимизация запроса с множеством связей

Сообщение Loveorigami »

Вы считаете количество тегов?
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Оптимизация запроса с множеством связей

Сообщение Loveorigami »

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

$QuerySale->joinWith(['tags AS tags]')
Это опечатка или у вас так в коде и есть?
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

не я не считаю количество тегов ( на этом запросе виснет скрипт( запустил его отдельно phpmyadmin тоже самое) , знаю что в запросе что-то не так. Не неопечатка. Что не так ? ( этим я думал что просто alias короткий таблицы приписываю (ON `s`.`id` = `tags`.`sale_id` ))
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимизация запроса с множеством связей

Сообщение zelenin »

в каких таблицах сколько строк?
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

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

CITY_sale = 30000 (30 слобцов)
CITY_agents = 700 (8 столбцов)
CITY_addresses = 3000 (10 столбцов)
CITY_tags = 125201 (3 столбца)
без JOIN работает нормально но делает много запросов
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимизация запроса с множеством связей

Сообщение zelenin »

схемы всех баз напишите
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Оптимизация запроса с множеством связей

Сообщение Balu »

Можно попробовать EXPLAIN сделать для запроса в phpmyadmin и глянуть что почем.
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

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

CREATE TABLE `CITY_sale` (
  `id` int(11) NOT NULL,
 ...
   `phone1` varchar(255) DEFAULT NULL,
 ...
  `id_address` int(4) DEFAULT NULL,
 ...
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

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

CREATE TABLE `CITY_agents` (
  `id` int(11) NOT NULL,
  `phone` varchar(100) DEFAULT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `type` int(1) DEFAULT NULL,
  `count_ads` int(11) DEFAULT NULL,
  `person` text,
  `status` int(1) DEFAULT '0',
  `person_type` int(1) DEFAULT '0',
  `variants_of_name` varchar(1000) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

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

CREATE TABLE `CITY_addresses` (
  `id` int(11) NOT NULL,
  `coords_x` varchar(10) DEFAULT NULL ,
  `coords_y` varchar(10) DEFAULT NULL',
  `address` varchar(256) DEFAULT NULL ',
  `street` varchar(50) DEFAULT NULL COMMENT 'название улицы',
  `house` int(3) DEFAULT '0' COMMENT 'номер дома',
  `hull` varchar(5) DEFAULT '-' COMMENT 'корпус',
  `locality` varchar(100) DEFAULT NULL,
  `district` varchar(100) DEFAULT NULL,
  `house_type` int(1) DEFAULT NULL,
  `floorcount` int(2) DEFAULT NULL COMMENT 'этажность дома',
   `year` int(4) DEFAULT NULL COMMENT 'год постройки',
   `status` int(1) NOT NULL DEFAULT '0',
  `url` varchar(255) DEFAULT NULL,
  `relative_id` int(9) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

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


CREATE TABLE `CITY_tags` (
  `id` int(5) NOT NULL,
  `user_id` int(3) DEFAULT '0',
  `tag_id` int(11) NOT NULL,
  `sale_id` int(12) DEFAULT NULL,
  `id_address_tag` int(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Оптимизация запроса с множеством связей

Сообщение Balu »

А чего у вас 3 таблицы MyISAM, а одна innoDB? И ключей чего-то не видно.
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

они есть все `id`, просто не скопировал с экспорта
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Оптимизация запроса с множеством связей

Сообщение Balu »

я не про id, я про
`user_id` int(3) DEFAULT '0',
`tag_id` int(11) NOT NULL,
`sale_id` int(12) DEFAULT NULL,
`id_address_tag` int(6) DEFAULT NULL
`id_address` int(4) DEFAULT NULL,
индексы расставили?
Да и таблицы лучше привести к одному типу
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

проиндесировал) и стало 403.0 ms) т.е. проблема была в этом? век живи век учись, спс
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

только почему-то теперь не могу выудить tag_id нормальным способом
пришлось вот так

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

\yii\helpers\ArrayHelper::getColumn($sale->tags,'tag_id')

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

эта связь возвращает объекты а я хочу чисто tag_id
 public function getTags()
    {
        return $this->hasMany(RealTags::className(), ['sale_id' => 'id']);
         
    }
и почему то условия не работают

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

 $QuerySale->Where(['>=', 's.date_start', (time() - $salefilter['period_ads'] * 86400)])
рендерится вот так

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

WHERE (`s`.`date_start` >= 1511882451) 
Аватара пользователя
Balu
Сообщения: 17
Зарегистрирован: 2017.12.04, 12:15

Re: Оптимизация запроса с множеством связей

Сообщение Balu »

кстати на date_start, disactive, status etc. (т.е. на любые поля используемые в where или в ON ) тоже бы не мешало индексов навесить
[email protected] писал(а): 2017.12.29, 18:12 рендерится вот так
так вроде правильно рендерится
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимизация запроса с множеством связей

Сообщение zelenin »

[email protected] писал(а): 2017.12.29, 16:40 они есть все `id`, просто не скопировал с экспорта
мне не нужны схемы с вырезанными ключами. я попросил схемы, чтобы проверить где у вас стоят индексы, а где нет
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимизация запроса с множеством связей

Сообщение zelenin »

[email protected] писал(а): 2017.12.29, 17:40 проиндесировал) и стало 403.0 ms) т.е. проблема была в этом? век живи век учись, спс
самое простое правило - индексы должны стоять по ключам джойнов и по колонкам которые участвуют в where
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

вот только никак не пойму почему dataProvider выводит на первой странице то 9 то 5 записей при их общем количестве 200?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Оптимизация запроса с множеством связей

Сообщение ElisDN »

[email protected] писал(а): 2017.12.30, 18:33 вот только никак не пойму почему dataProvider выводит на первой странице то 9 то 5 записей при их общем количестве 200?
При JOIN у строк id повторяются, поэтому и выводит одну $sale на каждую пачку повторов.
[email protected]
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: Оптимизация запроса с множеством связей

Сообщение [email protected] »

значит это неправильная работа запроса или он неправильно составлен разве не так? и еще общее количество строк явно больше максимального в таблице
Ответить