Оптимизация хранимых процедур MYSQL, когда две инструкции возвращают два разных результата

#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, и никакой внешней группировки или упорядочения.