lenk0belk0
@lenk0belk0
программироваю

Как оптимизировать запрос в базу данных Yii2?

Столкнулась с проблемой долгой загрузки страницы, связанной с тяжелым запросом в базу данных. Пока не могу придумать, как ее решить, в частности, из-за того, что еще плохо понимаю, по каким принципам AQ строит запросы и AR строит по ним объекты (ну и еще нет опыта оптимизации запросов).
Суть такая: есть две связанных модели (связь многие ко многим), и есть третья модель, данные в которой задаются для связи этих двух моделей (есть поля с id первой и второй модели). И когда надо получить данные из третьей модели для связи первых, это выглядит так:
public function getNumbers()
	{
		return $this->hasMany(Number::className(), [
            'Entity1Id' => 'Entity1Id', 
            'Entity2Id' => 'Entity2Id'
        ]);
	}

А потом получается такой запрос:
SELECT * FROM `numbers` WHERE ((`Entity1Id`, `Entity2Id`) IN (('193', '773'), ('450', '773'), 
('453', '773'), ('193', '774'), ('450', '774'), ('453', '774'), ('193', '775'), ('450', '775'), ('453', '775'), 
('193', '776'), ('450', '776'), ('453', '776'), ('193', '777'), ('450', '777'), ('453', '777'), ('193', '778'), 
('450', '778'), ('453', '778'), ('193', '779'), ('450', '779'), ('453', '779'), ('193', '780'), ('450', '780'), 
('453', '780'), ('193', '781'), ('450', '781'), ('453', '781'), ('193', '782'), ('450', '782'), ('453', '782'), 
('193', '783'), ('450', '783'), ('453', '783'), ('193', '784'), ('450', '784'), ('453', '784'), ('193', '785'), 
('450', '785'), ('453', '785'), ('193', '786'), ('450', '786'), ('453', '786'), ('193', '787'), ('450', '787'), 
('453', '787'), ('193', '788'), ('450', '788'), ('453', '788'), ('193', '789'), ('450', '789'), ('453', '789'), 
('193', '790'), ('450', '790'), ('453', '790'), ('193', '791'), ('450', '791'), ('453', '791'), ('193', '792'), 
('450', '792'), ('453', '792'), ('193', '793'), ('450', '793'), ('453', '793'), ('193', '794'), ('450', '794'), 
('453', '794'), ('193', '795'), ('450', '795'), ('453', '795'), ('193', '796'), ('450', '796'), ('453', '796'), 
('193', '797'), ('450', '797'), ('453', '797'), ('193', '798'), ('450', '798'), ('453', '798'), ('193', '799'), 
('450', '799'), ('453', '799'), ('193', '800'), ('450', '800'), ('453', '800'), ('193', '801'), ('450', '801'), 
('453', '801'), ('193', '802'), ('450', '802'), ('453', '802'), ('193', '803'), ('450', '803'), ('453', '803'),
 ('193', '804'), ('450', '804'), ('453', '804'), ('193', '805'), ('450', '805'), ('453', '805'), ('193', '806'), 
('450', '806'), ('453', '806'), ('193', '807'), ('450', '807'), ('453', '807'), ('193', '808'), ('450', '808'), 
('453', '808'), ('193', '809'), ('450', '809'), ('453', '809'), ('193', '810'), ('450', '810'), ('453', '810'), 
('193', '811'), ('450', '811'), ('453', '811'), ('193', '812'), ('450', '812'), ('453', '812'), ('193', '813'), 
('450', '813'), ('453', '813'), ('193', '814'), ('450', '814'), ('453', '814'), ('193', '815'), ('450', '815'), 
('453', '815'), ('193', '816'), ('450', '816'), ('453', '816'), ('193', '817'), ('450', '817'), ('453', '817'), 
('193', '818'), ('450', '818'), ('453', '818'), ('193', '819'), ('450', '819'), ('453', '819'), ('193', '820'), 
('450', '820'), ('453', '820'), ('193', '821'), ('450', '821'), ('453', '821'), ('193', '822'), ('450', '822'), 
('453', '822'), ('193', '823'), ('450', '823'), ('453', '823'), ('193', '824'), ('450', '824'), ('453', '824'), 
('193', '825'), ('450', '825'), ('453', '825'), ('193', '826'), ('450', '826'), ('453', '826'), ('193', '827'), 
('450', '827'), ('453', '827'), ('193', '828'), ('450', '828'), ('453', '828'), ('193', '829'), ('450', '829'), 
('453', '829'), ('193', '830'), ('450', '830'), ('453', '830'), ('193', '831'), ('450', '831'), ('453', '831'), 
('193', '832'), ('450', '832'), ('453', '832'), ('193', '833'), ('450', '833'), ('453', '833'), ('193', '834'), 
('450', '834'), ('453', '834'), ('193', '835'), ('450', '835'), ('453', '835'), ('193', '836'), ('450', '836'), 
('453', '836'), ('193', '837'), ('450', '837'), ('453', '837'), ('193', '838'), ('450', '838'), ('453', '838'), 
('193', '839'), ('450', '839'), ('453', '839'), ('193', '840'), ('450', '840'), ('453', '840'), ('193', '841'), 
('450', '841'), ('453', '841'), ('193', '842'), ('450', '842'), ('453', '842'), ('193', '843'), ('450', '843'), 
('453', '843'), ('193', '844'), ('450', '844'), ('453', '844'), ('193', '845'), ('450', '845'), ('453', '845'), 
('193', '846'), ('450', '846'), ('453', '846'), ('193', '847'), ('450', '847'), ('453', '847'), ('193', '848'), 
('450', '848'), ('453', '848'), ('193', '849'), ('450', '849'), ('453', '849'), ('193', '850'), ('450', '850'), 
('453', '850'), ('193', '851'), ('450', '851'), ('453', '851'), ('193', '852'), ('450', '852'), ('453', '852'), 
('193', '853'), ('450', '853'), ('453', '853'), ('193', '854'), ('450', '854'), ('453', '854'), ('193', '855'), 
('450', '855'), ('453', '855'), ('193', '856'), ('450', '856'), ('453', '856'), ('193', '857'), ('450', '857'), 
('453', '857'), ('193', '858'), ('450', '858'), ('453', '858'), ('193', '859'), ('450', '859'), ('453', '859'), 
('193', '860'), ('450', '860'), ('453', '860'), ('193', '861'), ('450', '861'), ('453', '861'), ('193', '862'), 
('450', '862'), ('453', '862'), ('193', '863'), ('450', '863'), ('453', '863'), ('193', '864'), ('450', '864'), 
('453', '864'), ('193', '865'), ('450', '865'), ('453', '865'), ('193', '866'), ('450', '866'), ('453', '866'), 
('193', '867'), ('450', '867'), ('453', '867'), ('193', '868'), ('450', '868'), ('453', '868'), ('193', '869'), 
('450', '869'), ('453', '869'), ('193', '870'), ('450', '870'), ('453', '870'), ('193', '871'), ('450', '871'), 
('453', '871'), ('193', '872'), ('450', '872'), ('453', '872'), ('193', '873'), ('450', '873'), ('453', '873'), 
('193', '874'), ('450', '874'), ('453', '874'), ('193', '875'), ('450', '875'), ('453', '875'), ('193', '876'), 
('450', '876'), ('453', '876'), ('193', '877'), ('450', '877'), ('453', '877'), ('193', '878'), ('450', '878'), 
('453', '878'), ('193', '879'), ('450', '879'), ('453', '879'), ('193', '880'), ('450', '880'), ('453', '880'), 
('193', '881'), ('450', '881'), ('453', '881'), ('193', '882'), ('450', '882'), ('453', '882'), ('193', '883'), 
('450', '883'), ('453', '883'), ('193', '884'), ('450', '884'), ('453', '884'), ('193', '885'), ('450', '885'), 
('453', '885'), ('193', '886'), ('450', '886'), ('453', '886'), ('193', '887'), ('450', '887'), ('453', '887'), 
('193', '888'), ('450', '888'), ('453', '888'), ('193', '889'), ('450', '889'), ('453', '889'), ('193', '890'), 
('450', '890'), ('453', '890'), ('193', '891'), ('450', '891'), ('453', '891'), ('193', '892'), ('450', '892'), 
('453', '892'), ('193', '893'), ('450', '893'), ('453', '893'), ('193', '894'), ('450', '894'), ('453', '894'), 
('193', '895'), ('450', '895'), ('453', '895'), ('193', '896'), ('450', '896'), ('453', '896'), ('193', '897'), 
('450', '897'), ('453', '897'), ('193', '898'), ('450', '898'), ('453', '898'), ('193', '899'), ('450', '899'), 
('453', '899'), ('193', '900'), ('450', '900'), ('453', '900'), ('193', '901'), ('450', '901'), ('453', '901'), 
('193', '902'), ('450', '902'), ('453', '902'), ('193', '903'), ('450', '903'), ('453', '903'), ('193', '904'), 
('450', '904'), ('453', '904'), ('193', '905'), ('450', '905'), ('453', '905'), ('193', '906'), ('450', '906'), 
('453', '906'), ('193', '907'), ('450', '907'), ('453', '907'), ('193', '908'), ('450', '908'), ('453', '908'), 
('193', '909'), ('450', '909'), ('453', '909'), ('193', '910'), ('450', '910'), ('453', '910'), ('193', '911'), 
('450', '911'), ('453', '911'), ('193', '912'), ('450', '912'), ('453', '912'), ('193', '913'), ('450', '913'), 
('453', '913'), ('193', '914'), ('450', '914'), ('453', '914'), ('193', '915'), ('450', '915'), ('453', '915'), 
('193', '916'), ('450', '916'), ('453', '916'), ('193', '917'), ('450', '917'), ('453', '917'), ('193', '918'), 
('450', '918'), ('453', '918'), ('193', '919'), ('450', '919'), ('453', '919'), ('193', '920'), ('450', '920'), 
('453', '920'), ('193', '921'), ('450', '921'), ('453', '921'), ('193', '922'), ('450', '922'), ('453', '922'), 
('193', '923'), ('450', '923'), ('453', '923'))) ORDER BY `Date`


Первое же решение - поменять структуру таблиц - связывать данные из третьей таблицы с первичным ключом таблицы со связями первых двух моделей, но проблема в том, что связь эту можно удалить, потом опять добавить, ее id поменяется, а данные должны быть по-прежнему доступны.
Кто-нибудь с таким сталкивался? Что здесь можно сделать?

ЗЫ:
проблема не в написании запроса и структуре таблиц, проблема скорее в знании Yii.
Его ORM делает зачем то несколько запросов подряд, а потом несколько раз последовательно использует конструкцию WHERE IN. Запрос на SQL языке я написала, работает он в 100 раз быстрее. Проблема в том, что бы его встроить в модель, что бы она мапилась нормально
  • Вопрос задан
  • 626 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Что показывает EXPLAIN запроса по использованию индексов?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы