代码之家  ›  专栏  ›  技术社区  ›  methodin

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

  •  0
  • methodin  · 技术社区  · 14 年前

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

    1. 大容量插入(无更新或删除,始终位于表的末尾)
    2. 超过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
    
    2 回复  |  直到 14 年前
        1
  •  0
  •   randomx    14 年前

    “SELECT将仅基于时间戳和int字段提取最近的行。”

    您是否为此目的使用视图进行了测试?似乎有胜算。

    例如。

    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;
    

        2
  •  0
  •   Strahd_za    14 年前

    我知道你已经接受了意见的答案,我知道你提到你仍然停留在5.0。。。但我仍然认为值得一提的是分区,据我所知,分区可以解决所有的问题。

    如果你确定你的查询正确地删减了分区,阅读也应该很快。

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