MySQL хранимая процедура для поиска из идентичных таблиц - PullRequest
6 голосов
/ 26 июля 2011

Привет, разработчики. Я исследую способы быстрого выбора строк из множества таблиц с одинаковой структурой.В таблицах слишком много данных, чтобы быть 1 таблицей.Таким образом, каждая таблица содержит данные за 1 месяц.Например, log_2011_01, log_2011_02 и т. Д. В таблицах есть столбец datetime created_at.

Мне нужно создать хранимую процедуру, она должна содержать 2 параметра datetime для поиска между этими датами и несколько других.

Теперь я вижу следующую реализацию: хранимая процедура должна вычислять коллекцию таблиц между двумя датами и генерировать sql для выбора данных с помощью union_all.Я думаю, что я буду тяжелым и не готов к высокой нагрузке, не так ли?Есть ли другие возможности сделать это?Спасибо

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

Согласен с другими комментариями, но я пытался помочь вам с SP. Этот SP создает запрос, который может быть выполнен с помощью подготовленных операторов .

-- SP definition:

DELIMITER $$

CREATE PROCEDURE iterateMonths(IN fromDate DATE, IN toDate   DATE)
BEGIN
  DECLARE tempDate DATE;
  DECLARE query    VARCHAR(1000); -- Query string, length might be increased

  SET tempDate = fromDate - INTERVAL (dayofmonth(fromDate) - 1) DAY;

  WHILE tempDate <= toDate
  DO

    IF query IS NOT NULL THEN
      SET query = concat(query, '\r\nUNION ALL\r\n');
    ELSE
      SET query = '';
    END IF;

    SET query = concat(query, 'SELECT * FROM log_', DATE_FORMAT(tempDate, '%Y_%m'));
    SET tempDate = tempDate + INTERVAL 1 MONTH;
  END WHILE;

  SELECT query; -- Output generated query
END
$$

DELIMITER ;

-- Call the SP

SET @fromDate = '2010-07-29';
SET @toDate = '2011-08-29';
CALL iterateMonths(@fromDate, @toDate);

-- Output:

SELECT * FROM log_2010_07
UNION ALL
SELECT * FROM log_2010_08
UNION ALL
SELECT * FROM log_2010_09
UNION ALL
SELECT * FROM log_2010_10
UNION ALL
SELECT * FROM log_2010_11
UNION ALL
SELECT * FROM log_2010_12
UNION ALL
SELECT * FROM log_2011_01
UNION ALL
SELECT * FROM log_2011_02
UNION ALL
SELECT * FROM log_2011_03
UNION ALL
SELECT * FROM log_2011_04
UNION ALL
SELECT * FROM log_2011_05
UNION ALL
SELECT * FROM log_2011_06
UNION ALL
SELECT * FROM log_2011_07
UNION ALL
SELECT * FROM log_2011_08
0 голосов
/ 27 августа 2011

Здесь нет альтернативы хранимой процедуре. Highload будет там, учитывая структуру ваших таблиц.

...