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