| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > Запрос тормозит когда он подзапрос |
| Автор: maxipub 15.1.2019, 14:57 | ||||||
| Добрый день. Оптимизирую один код. Уже есть прогресс, но уперся в одном месте. Есть запрос на выборку товаров:
goods - таблица с товарами cats - разделы items - наличие (одна строка - одна товарная позиция, нужно хранить индивидуальную информацию по каждой из них) stock_list - список складов Суть в том, что производится выборка данных по товарам указанного раздела (c.disabled=0 AND c.cat_id=123), которые есть в наличии (i.order_id=0) со всех доступных складов (l.stock_id=i.stock_id AND l.stock_avaliable=1). Все это дело выполняется примерно 0,02 сек. Но дергается часто. Сам по себе подзапрос возвращает список всех товаров в наличии со всех доступных складов. Он нужен для связи по конкретной ревизии товара. Если подзапрос выполнить как самостоятельный запрос:
То, он выполняется за 0,0004 сек и возвращает около 2500 записей - список id. Но если сделать что-то вида:
То это тут же начинает выполнятся порядка 0,02 сек. Я так понимаю, именно подзапрос все дело тормозит. Индексы везде вылизаны, и используются. Само по себе подзапрос, как самостоятельный запрос, выполняется быстро, и выозвращает не много результатов. Но стоит поставить его в SELECT * FROM (-подзапрос-) AS t - как получаем эти пресловутые 0,02 сек... Добавлено через 9 минут и 24 секунды Если вдруг не очевидно для чего подзапрос - чтоб уменьшить пересечения при джойнах: goods - десятки тысяч записей cats - сотни items - сотни тысяч stock_list - десятки И после этого придется накладывать на все группировку по товару... |
| Автор: maxipub 16.1.2019, 11:26 | ||
Akina, MySQL 5.7.19, я слышал что начиная с 5.7 он умеет делать индексы для подзапросов, ошибся? EXPLAIN содержит какой-то auto_key0:
А в общем все оказалось верно. Убрал подзапрос, сейчас все выполняется не дольше 0,0015 сек. Конечно, хотелось бы еще ускорить, но понимаю что места для маневров уже не много. Пока сойдет и так, позже еще попробую вернуться к этому вопросу. В очередной раз большое спасибо! |
| Автор: Akina 16.1.2019, 15:07 | ||
Не ошибся... вот только кто сказал, что этот автосгенерённый ключ будет подходить для оптимизации запроса? Не вижу потенции для ускорения, кроме создания подходящих индексов. Сплошные INNER JOIN и отборы по одному значению - нет пространства для манёвра. |