SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.04.2007 19:43:57

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

TEMPORARY tables

Доброго времени суток.

Нет ли ничего плохого(с точки зрения скорости выполнения) в том что я в данном алгоритме использую временную таблицу?
дело в том что она будет вызываться из 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)

Неактивен

 

#2 24.04.2007 23:33:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6732

Re: TEMPORARY tables

С точки зрения времени выполнения, хуже курсора Вы вряд ли что-нибудь
придумаете... ну, разве что JOIN без индексов smile

Временная таблица создается на поток, TRUNCATE ей делать не обязательно,
после создания она пустая. Временные таблицы создаются по-умолчанию в
памяти (пока ее размер не превысит tmp_table_size), так что ENGINE тоже можно
не писать.

Так как таблицы создаются на поток, у Вас очень быстро может закончиться
память - есть смысл удалять ненужные таблицы (когда они не нужны). Заодно
и решится вопрос с TRUNCATE - когда процедура выполняется дважды в одном
потоке.

Неактивен

 

#3 25.04.2007 02:16:03

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: TEMPORARY tables

paulus написал:

Временная таблица создается на поток, TRUNCATE ей делать не обязательно

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

Отредактированно Golova (25.04.2007 02:16:35)

Неактивен

 

#4 25.04.2007 02:22:24

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3857

Re: TEMPORARY tables

Курсор предполагает перебор всех строк в таблице (N строк => ~N операций). Поиск по ключу осуществляется за ~ log(N) операций. Разницу в произовдительности Вы можете увидеть на своем примере. Все зависит от числа строк в таблице, и от того, насколько условия в SELECT могут сузить количество рассматриваемых строк.

Неактивен

 

#5 27.04.2007 01:43:28

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: TEMPORARY tables

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

Отредактированно Golova (27.04.2007 01:44:03)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson