2010-09-27 78 views
0

我的工作目前仅对所有数据存储使用MySQL(MyISAM)。我们目前拥有300多个网络服务器和大约150个数据库。不幸的是,我不得不在30天内编写一个表结构来支持超过1亿行。我们的想法是:MySQL合并表 - 高流量和大量数据

  1. 大批量插入(没有更新或删除,并总是在表的末尾)
  2. 1行选择
  3. 数据超过30天扔掉

最好的解决方案似乎是将每天的表格合并到选择的合并表格中。确实会有重复的数据,但是SELECT只会根据时间戳和int字段来拉取最近的行。显然,有30张桌子并不理想,但如此生活。

这种方法是否存在固有缺陷?有没有其他方法可以解决这个问题(我们被困在5.0)?在创建新的一天表时,在合并表上执行ALTER TABLE时,表锁定会成为一个大问题?我们目前有一个表格旋转结构,但如果我们选择一个表格来选择我们希望从旧表格到新表格的数据,那么到达1亿行时,这个数据将非常缓慢。

还有其他技术可以以优雅的方式实现这一点,但我们的销售团队已经出售了解决方案,而且我们没有时间的奢侈。

任何输入,将不胜感激。

结构:

CREATE TABLE `merge_test_1` (
    `date_stamp` long NOT NULL, 
    `hash` char(32) NOT NULL, 
    `p_id` mediumint(8) unsigned NOT NULL, 
    `a_id` mediumint(8) unsigned NOT NULL, 
    `b_id` mediumint(8) unsigned NOT NULL, 
    PRIMARY KEY (`hash`,`p_id`,`date_stamp`) 
) ENGINE=MyISAM 

查询例如

SELECT b_id,a_id FROM merge_test WHERE hash='1' AND p_id=1 
ORDER BY date_stamp DESC LIMIT 1 

回答

0

如果我得到这个问题的核心是索引会因为大批量插入的无果而终,以及基于搜索关闭MAX(id)不符合您的标准... “SELECT只会根据时间戳和int字段拉最近的行。”

您是否使用视图测试过此目的?似乎赢得胜利。

E.g.

CREATE TABLE lotsofdata (
id INT UNSIGNED AUTO_INCREMENT, 
int_val INT UNSIGNED, 
the_timestamp TIMESTAMP, 
PRIMARY KEY(id)); 
-- 
CREATE VIEW FROM 
SELECT id,int_val,the_timestamp 
FROM lotsofdata 
WHERE the_timestamp = MAX(the_timestamp) 
AND MAX(int_val) 
LIMIT 0,1; 

我希望这会有所帮助。如果您可以提供表结构和查询示例,我想提供帮助。我只需要一些更具体的细节。

+0

我应该说我们的DBA组严重限制了我们可以做的事情并且不支持视图。带有示例结构和查询的编辑帖子。 – methodin 2010-09-27 20:09:18

0

我知道你已经接受了观点的答案,我知道你提到你仍然坚持在5.0 ...但我仍然认为值得提及分区,这从我收集的,将解决所有你的问题。
删除旧数据就像删除一个单独的表一样简单...并且比执行“从huge_table删除时间戳< x”
无限快,并且如果确保查询正确地修剪分区,也快。

事实上,我升级到5.1,因为我有一个非常相似的情况,并认为分区是唯一真正的解决方案。