Loading

简单数据库分表的思路

当某个数据表过大时,往往会影响查询响应的速度,这时候需要对数据表进行分表。通常以时间为分表的依据,根据表字段的数量,每列存储内容的数量,相应分表的时间大小也不一样。

以下就是一个定时任务执行日志数据表的分表的操作:
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定时脚本,定时在每个月最后一天执行一次该函数,也可以完成分表的操作;

posted @ 2019-02-17 15:19  集君  阅读(513)  评论(0编辑  收藏  举报