2010-03-05 75 views
0

我有一堆按日期排序的数据,每个表只包含一个月的数据。 (这是为了减少查询时间,我在说每个月表中有数百万行)MySQL多表查询

例如,

data_01_2010 holds data from 2010-01-01 to 2010-01-31 
data_02_2010 holds data from 2010-02-01 to 2010-02-28 

有时我必须根据特定的日期范围查询这些表。现在如果范围跨越前几个月。 2010-01-01至2010-02-28然后我需要查询两个表。

这可以通过单个查询来实现吗? 例如像:

SELECT * 
FROM data_01_2010, data_02_2010 
WHERE date BETWEEN '2010-01-01' AND '2010-02-28' 

与上述查询的问题是,它说的柱日期是不明确的,它是,因为该列是存在于两个表中。 (表具有相同的结构)

那么这是可以实现的一个单一的查询或我必须分别查询每个表?

回答

0

如果你做的逻辑在其他地方找出你需要查询哪些表,每个月都有相同的架构,你可以只工会表:

SELECT * 
FROM data_01_2010 
WHERE date BETWEEN '2010-01-01' AND '2010-02-28' 
UNION ALL 
SELECT * 
FROM data_02_2010 
WHERE date BETWEEN '2010-01-01' AND '2010-02-28' 

但是如果你需要查询计算哪些表联合,你正冒险进入存储过程领域。

+0

我用PHP编写的逻辑。 我从来没有通过工会。 UNION如何达到查询性能? – feketegy 2010-03-05 16:48:08

+0

使用UNION有点慢,因为它会对结果进行比较并删除重复项,但UNION ALL将忽略重复检查。两者都需要MySQL创建一个临时表,这是一个小开销,但不是很多。见http://www.mysqlperformanceblog.com/2007/10/05/union-vs-union-all-performance/ – adharris 2010-03-05 16:54:30

+0

所以,也许我会更好地使用多个查询呢? – feketegy 2010-03-05 16:56:30

2

这是分区功能如此强大的完美例子。通过分区,您可以将所有记录逻辑存储在同一个表中,而不会影响查询性能。

在这个例子中,你将有一个名为data的表(希望你会把它命名得比这更好),并根据date列的值进行范围分区(同样希望你会更好地指出这个列)。这意味着你能满足简单的要求进行选择:

SELECT * FROM data WHERE date BETWEEN '2010-01-01' AND '2010-02-28'; 

在幕后,数据库将只能访问在where子句基于所需的分区。

参考: http://dev.mysql.com/doc/refman/5.5/en/partitioning.html

+0

我没有具有分区功能的数据库。 我认为分区仍处于测试阶段。我错了吗? – feketegy 2010-03-05 17:01:45

+0

分区是在MySQL 5.1中引入的。 – 2010-03-05 17:45:11