woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

一个表有100亿条记录,如何优化

我们的数据库还在设计阶段。
我们预计数据量将会很大,
一年的时间里,一张表,就会产生100亿条数据,

表结构,如下
id,userid,createddate,
等等
正常情况下,100亿条记录如果都存在一个表里,
那么如果通过userid来查寻一定很慢。

所以,请教各位
在查询的性能优化上,
表结构,数据库结构,
有什么好的建议,
mysql实现,是否合适?

提示,业务需求中的一个特性是:
每个用户都有一个userid
用户只会查自己的数据,不会查看别人的数据。

谢谢各位。

===========================================================================

所有的优化都包含两方面,技术的优化和需求的优化。
单表100亿肯定不是一个好做法。即使每条只有1k,总的也差不多有10T,再考虑到备份,更复杂了。mysql单表也不支持10T数据。
有一个办法,是根据日期创建新的表插入数据。
另外在需求优化方面,可以是只查询近期的数据,那样速度最快。如果要查询历史数据,就单独做一个接口。

 

===========================================================================

我很好奇什么应用能在一年达到100亿的数据?还要用MySQL

简单的优化方法是分两个表存储,最近一段时间(如3个月)放在一个表里,其他放在历史表里,一般只查询第一个表。

===========================================================================

从硬件入手可以采取

1
、最简单的提升性能的方法就是提升硬件,增加硬件的投入效果立竿见影,不过这个主要是是投资方的可接受成本问题了。一般的来说从硬件方面的投资主要是购买大型机RS9000,购买磁盘柜(同时也是高可用的需要),增大内存。这些都可以提升系统的速度。
2
从软件方面来说首先应该尽量使用64位的数据库,同时数据库应当建立在裸设备上。
3
对于亿级别的数据通常是历史数据,而百万以及千万级别的数据通常是交易数据,这两种确实有很大区别,历史数据多为了读取,交易数据通常是可修改的,在建立索引的时候要考虑插入的问题。
4
通常有表分区功能的数据库就不需要在设计上进行分表设计,只有在数据库系统不提供该功能的时候才会采用分表设计。分区要建立在不同的磁盘上以提升IO性能。

从软件架构和业务层面
1.
使用SNA进行缓存如:memcached sina memcachedb
2.ORMapping
(如hibernate)的session缓存和线程级别缓存;
3.
使用领域模型驱动的分析设计方法分析业务;
这里关键是"领域模型驱动设计",因为性能之所以优化,而不是提升,是因为总有一天优化不下去;只有领域逐渐清晰才可能使系统具有伸缩性;

 

===========================================================================

   100亿条记录如果都存在一个表里,这样的速度mysql肯定是要被摒弃,就算oracle也吃不消这样的数据量,你这一张表就吃掉Ndbf。建议把表结构分拆吧,比如说你查询可以做一个联合查询接口或视图,该视图可以通过多张users表演化而来,先前的user表被拆分成若干表,对常用用户的表单独处理,对不常用的用户会定时通过程序进行数据转移,当然oracle的索引是少不了的,不过从根本上看这么大的数据量的表设计就有问题,或许从整个项目的构架上去考虑,重新设计才能正确解决这张表的性能问题。

===========================================================================

楼上的回答都可以参考一下
如果在mysql上只是提供查询功能,是否可以这样:
建立总表,存放历史所有数据,再根据时间,比如2个月或者1个月一个表建立分表,如果只查询某个人的信息的话,查询分表就好了,要是进行统计的话,对总表进行操作,看情况增加缓存功能

===========================================================================

100亿数据量大了,mysql单表好支持不了都少。如果不拆分数据,只能用分区来存储了,查询的优化就不说了。

===========================================================================

分表吧...你看你的100y数据是否都需要查询或者调用..如果对查询不是很高...可以做bigfile放弃数据库存贮..靠文件流和偏移量读取..

===========================================================================

mysql不合适,数据太大了!考虑一下创建物理索引

===========================================================================

兄弟,你只有做分表了.你可分成10000张表,把数据拆分开,平均放到这些表中,这样每张表相当于100万条数据,我想应该很快的.分表的具体方法我们可以再讨论

===========================================================================

Mysql一张表有100亿才很快的话 oracle早就关门了
oracle
100亿也吃不消的
你可以分到多张表里 比如按月来分

===========================================================================

只能分拆表

 

posted on 2009-06-09 13:23 肥仔 阅读(932) 评论(0)  编辑 收藏 引用 所属分类: 数据库


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理