0

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

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% 我在这个表中使用选择查询,这个表每天都会增加它的计数。目前我在 mysql 数据库中,它有 5.0.1 版本。我对使用 nosql 数据库有一个想法,但是有什么方法可以在 mysql 中处理,如果你建议 nosql 意味着我可以使用 cassandra 还是 accumulo ?

4

2 回答 2

0

添加这样的索引:

ALTER TABLE table ADD INDEX content_id ('content_id')

如果您有更具体的 SELECT 标准,您也可以添加多个索引,这也会加快速度。

多个和单个索引

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

还可以查看“大数据”解决方案。

于 2013-09-27T05:25:05.217 回答
0

有了这么大的数据量,您需要在机器集群中设置分片 MySQL 设置(Facebook 和 Twitter 在分片 MySQL 设置上存储大量数据,因此这是可能的),或者使用基于大表的解决方案在各种集群中的节点之间本地分布数据——Cassandra 和 HBase 是这里最流行的替代方案。您必须意识到,单台机器上的十亿条记录几乎会达到系统的所有限制——首先是 IO,然后是内存,然后是 CPU。这根本不可行。

如果您确实采用 Big Table 方式,Cassandra 将是最快的设置和测试。但是,如果您预期 map-reduce 类型的分析需求,那么 HBase 与 Hadoop 生态系统的集成更加紧密,并且应该可以很好地工作。在性能方面,它们都是并驾齐驱的,所以请选择。

于 2013-09-27T11:40:52.037 回答