хранимая процедура mysql для поиска из идентичных таблиц

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

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

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


person Fivell    schedule 26.07.2011    source источник
comment
Похоже, вы должны были использовать секционированную таблицу вместо отдельных таблиц в месяц. Знаете ли вы об использовании разделения диапазонов по дате и рассматривали ли вы его?   -  person searlea    schedule 26.07.2011
comment
@Fivell: Просто любопытно, сколько это слишком много?   -  person ypercubeᵀᴹ    schedule 26.07.2011
comment
@ypercube: я понятия не имею, сколько сейчас, может быть, 5-10 ГБ, но размер вырастет примерно в 10 раз в следующем году.   -  person Fivell    schedule 26.07.2011
comment
Хорошо, 5-10 ГБ в месяц — это очень много.   -  person ypercubeᵀᴹ    schedule 26.07.2011
comment
@searlea: многораздельные таблицы нельзя использовать из-за некоторых ограничений, которые у них есть.   -  person Fivell    schedule 28.08.2011


Ответы (2)


Согласен с другими комментариями, но я пытался помочь вам с 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
person Devart    schedule 29.08.2011

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

person Pale Blue Dot    schedule 27.08.2011