我怎样才能有效地处理百万条记录

时间:2013-09-27 05:07:43

标签: mysql cassandra query-optimization accumulo

我遇到性能问题,在使用select查询处理十亿条记录时,我有一个表格

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行要处理,所以这里分区没用,我从网站上得到了一个想法归档存储引擎,但它会使用全表扫描而不是在select中使用索引,基本上99%我在这个表中使用select查询,这个表每天都会增加它的数量。目前我在拥有5.0.1的mysql数据库version.i得到了一个关于nosql数据库使用的想法,但是在mysql中可以处理任何方法,如果你是在使用cassandra或accumulo来判断nosql是什么意思?

2 个答案:

答案 0 :(得分:0)

添加如下索引:

ALTER TABLE table ADD INDEX content_id ('content_id')

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

Multiple and single indexes

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

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

答案 1 :(得分:0)

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

如果你采用Big Table方式,Cassandra将是最快的设置和测试。但是,如果您期望map-reduce类型的分析需求,那么HBase与Hadoop生态系统的关系更紧密,并且应该可以很好地运行。性能方面,它们都是颈部和颈部,所以请选择。