MySQL合并表 - 高流量和大量数据

时间:2010-09-27 15:57:29

标签: mysql database merge

我的工作目前专门用于所有数据存储的MySQL(MyISAM)。我们目前有300多个网络服务器和大约150个数据库。不幸的是,我有能力在30天内编写一个表结构来支持超过1亿行。这个想法是:

  1. 高容量插入(无更新或删除,始终位于表格末尾)
  2. 1行选择
  3. 超过30天的数据被丢弃
  4. 最佳解决方案似乎是将每天的表格合并到选择的合并表中。确实会有重复的数据,但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
    

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:0)

我知道你已经接受了观点回答,我知道你提到你仍然坚持5.0 ...但我仍然认为值得提一下分区,从我收集的内容中,它将解决你所有的问题。登记/> 删除旧数据就像删除一个单独的表一样简单......并且比执行“从huge_table删除时间戳< x”中的速度快得多 如果你确保你的查询正确修剪分区,读取也应该很快。

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