2010-03-05 102 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