用于从相同表中搜索的mysql存储过程

用于从相同表中搜索的mysql存储过程,mysql,sql,stored-procedures,innodb,Mysql,Sql,Stored Procedures,Innodb,嗨,开发人员,我正在研究从许多具有相同结构的表中快速选择行的方法。表中的数据太多,无法成为一个表。所以每个表都包含1个月的数据。 例如log_2011_01、log_2011_02等。表格在处创建了日期时间列 我需要创建存储过程,它必须包含2个datetime参数,用于在这个日期和其他几个日期之间进行搜索 现在我看到下一个实现: 存储过程必须计算两个日期之间的表集合,并生成sql以使用union_all选择数据。 我想我会很重,还没有准备好承受高负荷,不是吗? 还有其他的可能性吗? 谢谢这里除了

嗨,开发人员,我正在研究从许多具有相同结构的表中快速选择行的方法。表中的数据太多,无法成为一个表。所以每个表都包含1个月的数据。 例如log_2011_01、log_2011_02等。表格在处创建了日期时间列

我需要创建存储过程,它必须包含2个datetime参数,用于在这个日期和其他几个日期之间进行搜索

现在我看到下一个实现: 存储过程必须计算两个日期之间的表集合,并生成sql以使用union_all选择数据。 我想我会很重,还没有准备好承受高负荷,不是吗? 还有其他的可能性吗?
谢谢

这里除了存储过程之外别无选择。考虑到您的表的结构,Highload将出现。

同意其他评论,但我试图帮助您使用SP。此SP构建可以使用执行的查询

--SP定义:
分隔符$$
创建过程迭代次数(在fromDate日期中,在toDate日期中)
开始
宣布临时日期;
声明查询VARCHAR(1000);--查询字符串,长度可能会增加
设置tempDate=fromDate—间隔(dayofmonth(fromDate)-1)天;

虽然tempDate听起来像是每个月都应该使用分区表,而不是单独的表。您是否知道并考虑过按日期使用范围分区?@Fivell:只是好奇,“太多”是多少?@ypercube:我不知道现在的大小可能是5-10GB,但明年的大小将增长10倍左右好的,每月5-10GB相当多。@searlea:分区表无法使用,因为它有一些限制
-- 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