如何为数十亿行和数百GB的大型表配置mysql

时间:2019-05-09 09:40:55

标签: mysql

在MySQL数据库中,我有一些用于报告目的的大表。当前最大的记录超过40亿行,数据大小超过300GB,索引大约250GB。平均行大小为84B。该表本身包含20个数字列和1个日期列。其中,有10列是外键,其他是指标。因为它与报告有关,并且日期是每个请求的关键组成部分,所以此表按以下日期按日期进行分区:PARTITION BY HASH(YEAR(date)* 12 + MONTH(date)) 分区96 那些表在InnoDB上使用MyISAM引擎。我曾考虑过迁移到InnoDB,但是对于SELECT请求,就获取结果而言,它真是一场噩梦(比使用MyISAM的同一张表要多数百倍)。

我最初看到这种分区(我没有创建分区)的最初假设是,使用where date = now()运行请求将使MySQL仅读取与该日期的哈希值匹配的分区,而不是所有分区(就像某些主索引一样),并且写请求只会锁定受影响的分区。但是,就性能而言,似乎并非如此。

因此,我想提供一些有关将MySQL用于此类大表的最佳方法的信息吗? 我知道分区总是被认为是更好的,但是考虑到锁定问题和索引,我想知道性能是否会更好地将我的表拆分成多个子表,然后再将UNION JOIN或对SELECT请求使用VIEW呢?

    CREATE TABLE `report_table` (
    `date` date NOT NULL,
    `key_1` int(11) NOT NULL,
    `key_2` int(11) NOT NULL DEFAULT '0',
    `key_3` int(11) NOT NULL DEFAULT '0',
    `key_4` int(11) NOT NULL DEFAULT '0',
    `key_5` int(11) NOT NULL DEFAULT '0',
    `key_6` int(11) NOT NULL DEFAULT '0',
    `key_7` int(11) NOT NULL DEFAULT '0',
    `key_8` int(11) NOT NULL DEFAULT '0',
    `key_9` int(11) NOT NULL DEFAULT '0',
    `metric_1` int(11) NOT NULL DEFAULT '0',
    `metric_2` int(11) NOT NULL DEFAULT '0',
    `metric_3` int(11) NOT NULL DEFAULT '0',
    `metric_4` int(11) NOT NULL DEFAULT '0',
    `metric_5` int(11) NOT NULL DEFAULT '0',
    `metric_6` int(11) NOT NULL DEFAULT '0',
    `metric_7` int(11) NOT NULL DEFAULT '1',
    `metric_8` float(27,10) DEFAULT '0.0000000000',
    `metric_9` float(27,10) DEFAULT '0.0000000000',
    `metric_10` float(27,10) DEFAULT '0.0000000000',
    `metric_11` float(27,10) DEFAULT '0.0000000000',
    PRIMARY KEY (`date`,`key_1`,`key_1`,`key_1`,`key_1`,`key_1`,`key_1`,`key_1`,`key_1`,`key_1`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    /*!50100 PARTITION BY HASH ( YEAR(date) * 12 + MONTH(date))
    PARTITIONS 96 */

1 个答案:

答案 0 :(得分:0)

更好地使用诸如Apache Spark / Apache Flink之类的最新趋势技术进行处理。由于您的数据量巨大,因此这些处理引擎可提供最佳性能。在这里,您还可以控制分区。请看一下像Hadoop一样简单的Apache Spark,它证明Spark比专门为处理BIGDATA设计的Hadoop快10到100倍。