Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
Нет ли ничего плохого(с точки зрения скорости выполнения) в том что я в данном алгоритме использую временную таблицу?
дело в том что она будет вызываться из PHP и создаваться всегда заново
(в программе на C она бы не создвалась каждый раз т.к. соединение с сервером было бы постоянно)
прошу не советовать как сделать так что бы PHP постоянно поддреживал соединение с MySQL сервером,
а сосредоточиться на создании/удалении временной таблицы или оптимизации кода данной процедуры.
DELIMITER $$
DROP PROCEDURE IF EXISTS `mydb`.`tst_loop`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `tst_loop`(OUT out_rez_count INT)
BEGIN
DECLARE l_field1 INT default 0;
DECLARE l_field2 varchar(64) default '';
DECLARE l_done INT DEFAULT 0;
DECLARE dept_csr cursor FOR
SELECT field1, field2 FROM logs LIMIT 5;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_done=1;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_res(
field1 int NOT NULL
field2 varchar(64) NOT NULL,
) ENGINE=MEMORY;
TRUNCATE TABLE tmp_res;
OPEN dept_csr;
loop1: LOOP
FETCH dept_csr into l_field1, l_field2;
IF l_done=1 THEN
LEAVE loop1;
END IF;
#дальше идут много условий с Select'ами
IF l_field1>0
#SELECT ...
#IF...
#IF...
#SELECT ...
END IF;
#короче много всякого кода обрабатывающего результаты из курсора.
#эта процедура должна вернуть result set поэтому я использую временную таблицу
#данные в этой временной таблице есть результат обработки данных из курсора(т.е. те что прошли проверки)
INSERT INTO tmp_res SET field1=l_field1, field2=l_field2;
END LOOP loop1;
CLOSE dept_csr;
SELECT SQL_CALC_FOUND_ROWS field1, field2 FROM tmp_res;
SELECT FOUND_ROWS() INTO out_rez_count;
END$$
DELIMITER ;
Отредактированно Golova (24.04.2007 22:11:09)
Неактивен
С точки зрения времени выполнения, хуже курсора Вы вряд ли что-нибудь
придумаете... ну, разве что JOIN без индексов
Временная таблица создается на поток, TRUNCATE ей делать не обязательно,
после создания она пустая. Временные таблицы создаются по-умолчанию в
памяти (пока ее размер не превысит tmp_table_size), так что ENGINE тоже можно
не писать.
Так как таблицы создаются на поток, у Вас очень быстро может закончиться
память - есть смысл удалять ненужные таблицы (когда они не нужны). Заодно
и решится вопрос с TRUNCATE - когда процедура выполняется дважды в одном
потоке.
Неактивен
paulus написал:
Временная таблица создается на поток, TRUNCATE ей делать не обязательно
я же специально сделал так. создаю только если она не существует, а если есть такая таблица то просто делаю ей TRUNCATE, что бы сэкономить время на ее создании/удалении в пределах потока.
Но из ваших слов я понял что это все делать ни к чему т.к. я использую курсор, который является самым медленным в этом коде. во сколько раз не подскажите на всякий случай...
Отредактированно Golova (25.04.2007 02:16:35)
Неактивен
Курсор предполагает перебор всех строк в таблице (N строк => ~N операций). Поиск по ключу осуществляется за ~ log(N) операций. Разницу в произовдительности Вы можете увидеть на своем примере. Все зависит от числа строк в таблице, и от того, насколько условия в SELECT могут сузить количество рассматриваемых строк.
Неактивен
надеюсь что применение курсора всё таки будет быстрее чем возврат данных запроса в клиентскую программу и обработки в ней этих данных, но временная таблица уже не потребуется, зато понадобятся selectы для каждой строчки что были в курсоре.
Отредактированно Golova (27.04.2007 01:44:03)
Неактивен