我有一个性能问题,在使用选择查询处理十亿条记录时,我有一个表
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生态系统的集成更加紧密,并且应该运行良好。在性能方面,它们都是并驾齐驱的,所以任你选择。