我遇到性能问题,在使用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是什么意思?
答案 0 :(得分:0)
添加如下索引:
ALTER TABLE table ADD INDEX content_id ('content_id')
如果你有更具体的SELECT标准,你也可以添加多个索引,这也会加快速度。
总的来说,如果你有一个像这样的表增长如此之快,那么你应该考虑重构你的sql设计。
查看“大数据”解决方案。
答案 1 :(得分:0)
根据这些数据的大小和数量,您需要在一组计算机中设置分片MySQL设置(Facebook和Twitter在分片MySQL设置上存储大量数据,因此可能),或者或者使用基于大表的解决方案,在各种集群中的节点之间本地分发数据 - Cassandra和HBase是这里最受欢迎的替代方案。你必须意识到,一台机器上的十亿条记录几乎会达到系统IO的每一个极限,其次是内存,其次是CPU。这根本不可行。
如果你采用Big Table方式,Cassandra将是最快的设置和测试。但是,如果您期望map-reduce类型的分析需求,那么HBase与Hadoop生态系统的关系更紧密,并且应该可以很好地运行。性能方面,它们都是颈部和颈部,所以请选择。