背景如下: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划分的。
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划分的。
因为我现在提出来的需求是比较少见的,因为大部分我们都是根据user_id去拿state_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
PARTITION BY KEY(`user_id`,`state_time`)
;
分成128个,可以id整除7,取余数,8种
mobile 整除8,取余数,8种
时间按一个点分开,2种
8×8×2 = 128
这样不知行不行,欢迎指正