2012-04-18 31 views
2

我有兩個不同的MySQL表,都包含時間序列數據(在這兩個都包含'timestamp'列)。除'timestamp'列之外,這兩個表除了'client_id'列之外不共享任何共同特徵。MySQL的聯合限制的性能

table_a 
- id 
- client_id 
- timestamp 
- ... 

table_b 
- id 
- client_id 
- timestamp 
- ... 

這兩個表都在(client_id,timestamp)上編制索引。

我想將這兩個表合併成一個分頁的時間序列。具體而言,我的意思是我試圖從table_atable_b的聯合加載N個記錄(偏移量爲M),按timestamp排序。

我試着用這樣的語句來做到這一點:

(SELECT 'a', id FROM table_a WHERE client_id=1) UNION (SELECT 'b', id FROM table_b WHERE client_id=1) ORDER BY timestamp LIMIT 100; 

不幸的是,生成的查詢似乎來自兩個表抓取所有匹配的行,組合,然後應用極限。

注意對單個表查詢是超級快:

SELECT 'a', id FROM table_a WHERE client_id=1 ORDER by timestamp LIMIT 100 

有沒有更好的方式來索引的表或寫入聯合查詢?

回答

5

這裏不能很好地使用索引,因爲在兩個單獨的表中有兩個單獨的索引。

你可以添加一個限制到每一個人選擇,但是這隻會工作的第一頁,而不是偏移。

如果你願意放棄一個「頁」是限制加上偏移量的要求,你可以分頁其他一些絕對(而不是相對)的方式,如通過一天。例如: -

(SELECT 'a', id, timestamp FROM table_a WHERE client_id=1 AND timestamp BETWEEN '2014-04-18 00:00:00' AND '2014-04-18 23:59:59') 
UNION 
(SELECT 'b', id, timestamp FROM table_b WHERE client_id=1 AND timestamp BETWEEN '2014-04-18 00:00:00' AND '2014-04-18 23:59:59') 
ORDER BY timestamp; 

但是,它也有可能是你的數據不完全正常化,並從表-A和表-B的共同屬性應該是在第三個表。這種模式被稱爲「連接表繼承」。

例如:

table_common 
- id 
- type ('a' or 'b') 
- client_id 
- timestamp 
- primary key: (id, type) if id is not unique. 
- index: (client_id, timestamp) 

table_a 
- id (same value as in table_common) 
... 

table_b 
- id (same value as in table_common) 
... 

既然你現在共享一個共同的指數,你可以做到以下幾點:

SELECT id, type, timestamp FROM table_common 
WHERE client_id=1 ORDER BY timestamp LIMIT 100; 

如果你需要從子表的更多領域,使用LEFT OUTER JOIN和包括type在條件:

SELECT * FROM table_common 
LEFT OUTER JOIN table_a ON table_common.type='a' AND table_common.id=table_a.id 
LEFT OUTER JOIN table_b ON table_common.type='b' AND table_common.id=table_b.id 
ORDER BY timestamp LIMIT 100; 
0

一個簡單的方法來做到這一點是相同的LIMIT適用於每個單獨的查詢,因爲根據定義,你將永遠需要比N行更從任何個人查詢:

(SELECT 'a', id FROM table_a WHERE client_id=1 ORDER BY timestamp LIMIT 100) 
UNION 
(SELECT 'b', id FROM table_b WHERE client_id=1 ORDER BY timestamp LIMIT 100) 
ORDER BY timestamp 
LIMIT 100; 
+1

這將只適用於f第一頁,不適用於偏移量。 – 2012-04-18 16:14:12

+0

@FrancisAvila,好點。在這個問題上我沒有仔細觀察。 – 2012-04-18 16:46:10