#python #mysql #stored-functions
Вопрос:
Мой API вызывает два оператора sql, возвращая два разных вывода
mycursor.execute("SELECT a,b,c,d,e,f,g,h,i,j,k \
from table_1 \
left join table_2 \
left join table_3 \
left join table_4 \
left join table_5 \
")
myresult = mycursor.fetchall()
mycursor.execute("SELECT r,s,t,u,v,w,x,y,z \
from table_6 \
left join table_8 \
left join table_9\
left join table_10\
left join table_11 \
")
myresult = mycursor.fetchall()
Оба запроса select требовали много времени для выполнения
итак, я планировал преобразовать эти два запроса в две разные хранимые процедуры
DROP PROCEDURE IF EXISTS statement_1;
DELIMITER //
CREATE PROCEDURE statement_1
BEGIN
SELECT a,b,c,d,e,f,g,h,i,j,k
from table_1
left join table_2
left join table_3
left join table_4
left join table_5
END //
DELIMITER ;
DROP PROCEDURE IF EXISTS statement_2;
DELIMITER //
CREATE PROCEDURE statement_2
BEGIN
SELECT r,s,t,u,v,w,x,y,z
from table_6
left join table_8
left join table_9
left join table_10
left join table_11
END //
DELIMITER ;
и позвони им
myresult.callproc('statement_1')
myresult.callproc('statement_2')
Будет ли этот метод быстрее, или мне нужно объединить эти два оператора в одну хранимую процедуру с помощью a UNION ALL
?
Возможно ли это вообще , если предположить, что эти два оператора возвращают совершенно разные и не связанные результаты.
Комментарии:
1. Вам, вероятно, просто нужны индексы на
join
ключах. Или, возможно, ваши данные велики, и любой запрос займет много времени, чтобы вернуть нужные вам результаты.2. Перемещение запросов в хранимую процедуру не поможет. Использование союза поможет не более чем тривиально. Я предлагаю вам задать новый вопрос, чтобы помочь оптимизировать ваши запросы, показывая выходные данные (в виде текста, а не изображений)
show create table yourtablename
для всех таблиц иexplain select ...rest of your query
Ответ №1:
Короткий ответ: Нет. Нам нужно посмотреть на каждый выбор.
Длинный Ответ:
Два независимых SELECTs
не будут работать быстрее через сохраненный процесс, VIEW
, UNION
, и т.д.
Некоторые исключения:
- Хранимая процедура с одним SQL: вероятно, разница равна нулю.
- Хранимая процедура с обоими SQLS: Если сервер удален от клиента, уменьшение количества SQLS, отправляемых на сервер, экономит время задержки в сети. (Трансатлантическое время составляет порядка 0,1 с, так что, вероятно, это не то, что вы считаете «медленным».)
VIEWs
в основном это синтаксический сахар, так что вряд ли он поможет в любом случае.UNION
возможно, потребуется создать временную таблицу, что может привести к небольшому замедлению. Временная таблица исключена в последнейUNION ALL
версии MySQL, и никакой внешней группировки или упорядочения.