简单数据库分表的思路
当某个数据表过大时,往往会影响查询响应的速度,这时候需要对数据表进行分表。通常以时间为分表的依据,根据表字段的数量,每列存储内容的数量,相应分表的时间大小也不一样。
以下就是一个定时任务执行日志数据表的分表的操作:
1.判断当时时间维度下数据表是否存在;
2.如果没有存在,则进行分表操作,并以事务操作的形式进行操作;
/**
* 定时按照月份分表
*/
public function checkLogTable() {
$ym = date("Ym",time());
$table = $this->tableArr['scriptLog']."_".$ym;
$sql = "select * from {$table} limit 1";
$isExist = $this->db->exists($sql);
if(!$isExist) { //当前表不存在,则创建新表
$this->db->begin();
$this->db->query('use db_script_log;');
$table = "db_script_log"."_".$ym;
$sql = "CREATE TABLE `{$table}` (`id` int(11) NOT NULL,
`startTime` datetime NOT NULL,
`endTime` datetime NOT NULL,
`className` varchar(25) NOT NULL,
`functionName` varchar(25) NOT NULL,
`logContent` varchar(500) NOT NULL,
`rows` int(11) NOT NULL COMMENT '执行条数',
`add` int(11) NOT NULL COMMENT '新增条数',
`update` int(11) NOT NULL COMMENT '更新条数',
`error` int(11) NOT NULL COMMENT '错误条数',
`other` varchar(200) NOT NULL COMMENT '其他参数',
`httpinfo` varchar(500) NOT NULL COMMENT 'api错误信息',
`dbinfo` varchar(500) NOT NULL COMMENT 'db错误信息',
`seconds` int(11) NOT NULL COMMENT '持续时间(秒数)'
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
$result1 = $this->db->query($sql);
$sql = "ALTER TABLE `{$table}`
ADD PRIMARY KEY (`id`,`startTime`) USING BTREE,
ADD KEY `startTime` (`id`) USING BTREE,
ADD KEY `functionName` (`functionName`)";
$result2 = $this->db->query($sql);
$sql = "ALTER TABLE `{$table}` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT";
$result3 = $this->db->query($sql);
if($result1 || $result2 || $result3) {
$this->db->rollBack();
}else {
$this->db->commit();
}
}
}
以上,判断是否存在该分表函数是基于日志系统在需要写入数据表时执行,那么以上函数每天可能需要执行很多次。这时,可以考虑利用crontab定时脚本,定时在每个月最后一天执行一次该函数,也可以完成分表的操作;