zoukankan      html  css  js  c++  java
  • 简单数据库分表的思路

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

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

  • 相关阅读:
    YTU 2625: B 构造函数和析构函数
    YTU 2623: B 抽象类-形状
    YTU 2622: B 虚拟继承(虚基类)-沙发床(改错题)
    YTU 2621: B 继承 圆到圆柱体
    YTU 2620: B 链表操作
    YTU 2619: B 友元类-计算两点间距离
    刷题总结——切蛋糕(ssoj)
    刷题总结——拦截导弹(ssoj)
    算法复习——费用流模板(poj2135)
    算法复习——网络流模板(ssoj)
  • 原文地址:https://www.cnblogs.com/chq3272991/p/10608494.html
Copyright © 2011-2022 走看看