因为性能问题,对数据表进行了水平切分。切分方案如下:
一个大的用户表user表,按user_id的值进行切分,
user_id%3=0(数据库0)
user_id%3=1(数据库1)
user_id%3=2(数据库2)
user_id被3求模后分别存放到3个数据库中。这样做的好处是减轻了单表大数据量引起的性能问题。但是随之遇到一些问题,
1.对于批量删除有什么好的方案。
1)删除指定user_id范围的数据,比如user_id>302 and user_id<3400;这样的需求如何处理高效,难道必须要循环范围内每个id,然后算出其存放在哪个数据库,然后删除之。或者先在这个范围内统计出3个数据库的id列表,然后执行三次批量删除。总感觉这些方案效率都不高。
2)删除某个条件的数据,比如delete user where user.name like '%ggg%' and .. 这里可能有更复杂的过滤条件。这就比较麻烦了。。
2.对于更新数据有类似删除一样的问题。
1)类似update user set name='aa' where user_id>302 and user_id<3400的处理。
2)类似于删除。。
3.查询问题:
1)根据用户id范围查询,比如select * from user where user_id>302 and user_id<3400 
2)根据其他条件查询。以上的这些问题,我想是很通用的问题,任何做数据水平切分处理的时候都会遇到,大家有没有好的解决方案,一起探讨下。

解决方案 »

  1.   

    批量的话,预先切分成三部分,然后操作三个数据库。PS:上次那个ms的问题解决了?
      

  2.   

    有一定道理,特别是切分的数据库不多的情况下。但是存在的问题是:
    不管你你delete/update的数据是否在制定的数据库,都要在这个些数据库中执行一次SQL,如果分的数据库多了可能要牺牲点性能。另外,我突然想起来一个分表的问题:
    以前有个项目,在同一个数据库中,对同一表进行分表处理,由于该表数据量相当大,每天都400万数据,这样我们采取的方案是每天生成一个表存储。
    这种情况下的删除/更新/查询就比较麻烦,因为不可能对这个N个表都执行一次SQL吧。每天一个表是很多的。
      

  3.   

    你的意思也是
    先在删除/更新/查询的范围内统计出3个数据库的id列表,然后执行三次批量SQL,是这样吗,我也只能想到这个办法。但是对于条件不是user_id的处理好像这样就不行。比如类似:where user.name like '%ggg%' and ..  
      

  4.   

    MYSQL数据库,800-1000万的数据量。不过这里的问题,主要是数据的水平切分处理的时候需要面对的问题。进行水平切分处理基本都要面对这些问题。
      

  5.   

    MySQL 从 5.1 版本开始引入了分区表,可以像 Oracle 那样使用分区。
      

  6.   

    数据水平切分与分表处理异同:
    相同处:都是对同一数据表中的数据按一定的分隔规则分成多个数据表保存。
    不同处:
    1.存放的数据库不一样:
    数据水平切分:将分开的数据表放在不同的数据库中。
    分表处理:将分开的数据表放在原来的数据库中。
    2.数据表的表名处理不同。
    数据水平切分:分开的数据表表名跟原来的表名一样。
    分表处理:分开的数据表表名不一样,一般以某字段的值的范围命名,如按日期命名,user_20091021
    3.选择方案的背景不同:
    数据水平切分:一般采取这个方案有2个目的:1)为了解决单表数据量大引起的性能问题,这个与分表的背景一样,2)为了分担单个数据库压力。
    分表处理:主要是解决单表数据量大引起的性能问题,而此时整个数据库的压力并不大。以上是本人的个人观点,希望大家一起探讨。
      

  7.   

    建议楼主按7楼的方案试试。我用的是informix,每日数据进出200万,因此也采用了数据库分区。由于数据库了解不多,因此采用这种方案,在性能上到底有多少提高,我不清楚。但是数据库分区是由数据库的后台程序完成,对于应用开发人员而言,就是透明的了。换句话说,采用数据库分区,几乎零成本就能获得数据分区的好处。
      

  8.   

    哦,这样啊,我能力有限。建议你自己把帖子移到 MySQL 版块吧。