如何有效处理十亿条记录



我有一个性能问题,在使用选择查询处理十亿条记录时,我有一个表

CREATE TABLE `temp_content_closure2` (
  `parent_label` varchar(2000) DEFAULT NULL,
  `parent_code_id` bigint(20) NOT NULL,
  `parent_depth` bigint(20) NOT NULL DEFAULT '0',
  `content_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  KEY `code_content` (`parent_code_id`,`content_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY KEY (parent_depth)
PARTITIONS 20 */ |

使用了分区,它将通过细分表来提高性能,但它在我的情况下没有用,我在此表中选择的示例

+----------------+----------------+--------------+------------+
| parent_label   | parent_code_id | parent_depth | content_id |
+----------------+----------------+--------------+------------+
|  Taxonomy |          20000 |            0 |        447 |
| Taxonomy |          20000 |            0 |       2286 |
|  Taxonomy |          20000 |            0 |       3422 |
| Taxonomy |          20000 |            0 |       5916 |
+----------------+----------------+--------------+------------+

这里的content_id在parent_dept方面将是唯一的,所以我使用 parent_depth 作为分区的键。在每个深度我都有2577833行要处理,所以这里的分区没有用,我从网站上得到了一个使用存档存储引擎的想法,但它将使用全表扫描而不是在选择中使用索引,基本上 99% 我在这个表中使用 select 查询,这个表每天都会增加它的计数.目前我在具有 5.0.1 版本的 MySQL 数据库中,我对 NoSQL 数据库有一个想法使用,但是在MySQL中有什么方法可以处理,如果您建议NoSQL意味着我可以使用Cassandra或Accumulo?

添加如下索引:

ALTER TABLE table ADD INDEX content_id ('content_id')

如果您有更具体的 SELECT 条件,您还可以添加多个索引,这也将加快速度。

多个和单个索引

总的来说,如果你有一个像这样的表增长如此之快,那么你可能应该考虑重组你的SQL设计。

查看"大数据"解决方案。

有了这种数据大小和数量,你需要在机器集群中设置分片MySQL设置(Facebook和Twitter在分片MySQL设置上存储了大量数据,所以这是可能的),或者使用基于Big Table的解决方案,在各个集群的节点之间本地分发数据 - Cassandra和HBase是这里最受欢迎的替代方案。您必须意识到,一台机器上的十亿条记录几乎会达到系统的所有限制 - 首先是IO,其次是内存,其次是CPU。这根本不可行。

如果你确实采用大桌子的方式,Cassandra将是最快的设置和测试。但是,如果您预计map-reduce类型的分析需求,那么HBase与Hadoop生态系统的集成更加紧密,并且应该运行良好。在性能方面,它们都是并驾齐驱的,所以任你选择。

相关内容

  • 没有找到相关文章

最新更新