• 简单数据库分表的思路


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

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

  • 相关阅读:
    微信小程序实现运动步数排行(可删除)
    一个文艺的在线生成漂亮的二维码工具网站
    微信小程序常见的UI框架/组件库总结
    小程序踩坑记- tabBar.list[3].selectedIconPath 大小超过 40kb
    推荐一款便捷的在线图片处理工具
    如何在本地运行查看github上的开源项目
    微信小程序实现运动步数排行(可删除)
    从零开始学ios开发(三):第一个有交互的app
    从零开始学ios开发(二):Hello World!来啦!
    从零开始学ios开发(一):准备起航
  • 原文地址:https://www.cnblogs.com/chq3272991/p/10608494.html
Copyright © 2020-2023  润新知