2012-04-18 42 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