背景如下:1个global数据库实例 128个local数据库实例 表log存在于global库,因为压力过大,将表log拆分,放到128个local库中global.log结构:
CREATE TABLE `log` (
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `mobile` bigint(20) unsigned NOT NULL DEFAULT '13912345678',
   `state_time` bigint(20) NOT NULL DEFAULT '0',
  KEY idx_state_time` (`state_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;local.log结构
CREATE TABLE `log` ( 
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', 
  `mobile` bigint(20) unsigned NOT NULL DEFAULT '13912345678', 
   `state_time` bigint(20) NOT NULL DEFAULT '0', 
  KEY `idx_state_log_user_id` (`user_id`), 
  KEY `idx_state_time` (`state_time`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
其实也就是将大表拆分之后分散到各个分库。问题:就是如何可以从新的表中,也即新的local.log表中读取某个时间段内的条数,也即
select user_id, mobile, state_time where state_time between #minTime# and #maxTime# limit #offset#, #limit#也即如何做才可以有比较好的效率呢?应该不仅仅说只有对每个分库表都做一遍查询然后才得到答案的吧?忘高手指点。注意local库的分库规则是根据user_id划分的。

解决方案 »

  1.   

    你的拆分原则是什么? 如果 where state_time between #minTime# and #maxTime# 这个条件在每个表中都有符合条件的记录,那则只能如你所说,到每个LOCAL表中查询后合并结果。
      

  2.   

    MYSQL中的分区表或者对这个应用可以借鉴。
      

  3.   

    如果 你是根据user_id划分,要查询128个表再UNION,可以考虑按年月来分表
      

  4.   

    可以做个union all 的128表视图,会方便些。
      

  5.   

    分表的原则是根据user_id进行拆分的。不考虑state_time,但是在state_time做了一个索引。
    因为我现在提出来的需求是比较少见的,因为大部分我们都是根据user_id去拿state_log相应的记录。
      

  6.   

    诚如你所说,按照年月份来分表,那么如果我现在又有个需求,需求是查询某个user_id的所有记录,那么岂不是还是会面临同样的问题吗?
      

  7.   

    如果你按UID分区,按时间查找,那分表对这个查询无任何帮助,只能在各关中查询后再合并。
      

  8.   

    试试 建立1个`user_id`,`state_time` KEY分区
    CREATE TABLE `log` ( 
      `user_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0', 
      `mobile` BIGINT(20) UNSIGNED NOT NULL DEFAULT '13912345678', 
       `state_time` BIGINT(20) NOT NULL DEFAULT '0', 
      KEY `idx_state_log_user_id` (`user_id`), 
      KEY `idx_state_time` (`state_time`) 

    ENGINE=INNODB DEFAULT CHARSET=utf8
    PARTITION BY KEY(`user_id`,`state_time`)
      

  9.   

    是均匀分布的吗,
    分成128个,可以id整除7,取余数,8种
    mobile 整除8,取余数,8种
    时间按一个点分开,2种
    8×8×2 = 128
    这样不知行不行,欢迎指正