2015-09-29 3 views
0

[EDIT] Ниже представлен не тот запрос, который у меня возникает с производительностью. Это всего лишь упрощенный запрос. Поскольку я только хотел бы знать, можно ли хранить несколько результатов в переменной и использовать эту переменную в состоянии IN.MYSQL: используемая переменная при условии IN

У меня был этот запрос ниже внутри процедуры, которую я хотел бы изменить для оптимизации.

SELECT * FROM request WHERE facility_id IN (SELECT facility_id FROM facility); 

Что я хотел бы сделать, так это хранить подзапрос в переменной и использовать эту переменную в основном запросе.

SET @facilities = (SELECT facility_id FROM facility); 

SELECT * FROM request WHERE facility_id IN (@facilities); 

Но у меня есть ошибка Subquery returns more than 1 row. Как я должен это делать? Любая помощь приветствуется.

Я нашел ссылку, которая предлагает такой способ http://www.mysqlperformancetuning.com/how-to-speed-up-mysql-by-optimization?nocache=1#comment-961. Но я не могу понять.

+0

Вы идентифицировали это как узкое место производительности? Если ваш SP не делает много вещей с этим набором результатов, это выглядит как тяжелая работа для небольшого выигрыша. Вероятно, вы можете получить больший импульс, изменив дополнительный запрос на соединение (mysql традиционно обрабатывает соединения лучше, чем подзапросы, но сравнивает !!) – e4c5

+0

@ e4c5 Это не фактический запрос. Я просто упростил это. Обычно запрос занимает не менее 20 секунд и иногда достигает 60 секунд для выполнения. Это включает в себя также взгляды, которые усложняют ситуацию. – Pelang

+0

В таком случае, я думаю, вам нужно будет отредактировать свой вопрос и опубликовать более показательный запрос. Ясно, судя по полученному вами ответу, я не единственный, кто задавался вопросом, было ли это преждевременной оптимизацией. – e4c5

ответ

0
SET @facilities = (SELECT facility_id FROM facility); 

Этот запрос будет действителен только если таблица facility имеет только одну запись еще это приведет к ошибке, которое вы получаете. В настоящее время ваш запрос возвращает более одной записи, которую нельзя сохранить в переменной и, следовательно, приведет к ошибке.

+0

Есть ли способ сохранить несколько результатов в переменной? Как тип массива. – Pelang

+0

@Pelang: - Почему вы хотите это сделать? 'SELECT * FROM request WHERE object_id IN (SELECT object_id FROM facility);' достаточно хорошо. Какая проблема с производительностью с этим запросом? –

+0

Я где-то читал, что наличие подзапроса в ГДЕ может повлиять на производительность. Предложенный запрос - это простой запрос. Но рабочий запрос у меня есть. У меня есть еще несколько условий IN, которые используют подзапрос, который я бы хотел устранить. – Pelang

Смежные вопросы