http://blog.zol.com.cn/2210/article_2209590.html

/**
 * 分表程序
 *
 * @author Shen Xi shen.xi@zol.com.cn
 * @date 2010-08-19
 */
set_time_limit(0);
$con = mysql_connect("127.0.0.1","root","111111");#创建数据库连接
mysql_select_db ("test",$con);#选择连接数据库“test”
mysql_query("set names gbk");#设置获取数据得字符集

$slctTable = "tb_test";

#获取被分表结构
$sql = "show create table $slctTable";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$createTable = $row['Create Table'];

//echo "$createStr
";

#获取被分表字段名
$field = mysql_list_fields("test",$slctTable,$con);
$filedNum = mysql_num_fields($field);
$fieldStr = "";
for($i=0;$i < $filedNum;$i++){
    $fieldStr.= "`". mysql_field_name($field, $i)."`,";
}
if(strlen($fieldStr) == 0){
    echo "获取表字段有误!";
    exit;
}
$fieldStr = "(".substr($fieldStr,0,-1).")";

//echo "$fieldStr
";
//exit;

#查找最大用户id
 $sql = "SELECT max(id) as maxid
         FROM  $slctTable";
 $result =mysql_query($sql);
 $row = mysql_fetch_row($result);
 
 $maxid = (int)$row[0];
// var_dump($maxid);
 //exit;
 if($maxid > 1){
     $count = ceil($maxid / 1000);
 }else{
     echo "用户最大id有误";
     exit;
 }
 $per = 500;#每次取得的记录条数
 $prefix = "tb_test";
 for($i=0;$i<=$count;$i++){
     
     $table = $prefix.$i;
    #生成创建新表的sql语句
    $createStr = str_replace("CREATE TABLE `$slctTable`","CREATE TABLE IF NOT EXISTS `$table`",$createTable);
    $filehandle = fopen ($table.".sql", "a+");
    fwrite($filehandle, $createStr."\r\n");
//    mysql_query($createStr);
     $sql="SELECT COUNT(*) AS num
             FROM $slctTable where CEILING(id / 1000)=$i";
    $result =mysql_query($sql);
    $row = mysql_fetch_row($result);
    
    $num = (int)$row[0];
     $maxNum= ceil((int)$num / $per);
     
     for($j=0;$j<$maxNum;$j++){
         $lmt = $j * $per;
         if($lmt <= (int)$num){
             $sql = "select * from $slctTable where CEILING(id / 1000)=$i order by id limit $lmt,500";
//             fwrite($filehandle, $sql."");
            $inStr="REPLACE INTO ".$table." ".$fieldStr." VALUES";
//            fwrite($filehandle, $inStr."\r\n");
            $result = mysql_query($sql);             
             if($result){
                 $value="";
                 while ($row = mysql_fetch_row($result)){
                     $value.= "(";
                     for($n=0;$n < $filedNum;$n++){
                         $value.="'".addslashes($row[$n])."',";
                     }
                     if(strlen($value)>2){
                         $value = substr($value,0,-1)."),\r\n";
                     }
                 }
                 if(strlen($value)>2){
                     $value = substr($value,0,-3)."";
                 }
                 $inStr = $inStr.$value;
//                 echo $inStr."\r\n";
//                 mysql_query($inStr);
                 fwrite($filehandle, $inStr);                 
             }
//             fclose($filehandle);
//             exit;
         }else{
             break;
         }
     }
     fclose($filehandle);

}

?>

PHP自动分表程序的更多相关文章

  1. 支持MySql的数据库自动分表工具DBShardTools发布

    支持MySql的数据库自动分表工具DBShardTools发布 前段时间参与了公司的一个项目,这个项目的特点是数据量.访问量都比较大,考虑使用数据库水平分表策略,Google了大半天,竟然没有找到分表 ...

  2. Mysql Event 自动分表

    create table TempComments Like dycomments; 上述 SQL语句创建的新表带有原表的所有属性,主键,索引等. 自动分表怎么做呢? 使用上述语句自动创建分表. 那么 ...

  3. 使用NLog把日志写入数据库并按天自动分表

    前言 最近用Asp.net Core开发程序的时候 因为时间的关系,就没有过多的去关注日志方面的功能 都是直接用系统的ILogger先记录着,然后看日志的时候就先在命令行看日志 在开发阶段没有什么问题 ...

  4. NPOI 导出excel数据超65535自动分表

    工作上遇到的问题,网上找了一些资料 整理了一个比较可行的解决方案. NPOI 大数据量分多个sheet导出 代码段 /// <summary> /// DataTable转换成Excel文 ...

  5. 基于efcore的分表组件开源

    ShardingCore ShardingCore 是一个支持efcore 2.x 3.x 5.x的一个对于数据库分表的一个简易扩展, 目前该库暂未支持分库(未来会支持),仅支持分表,该项目的理念是让 ...

  6. .NET 5 全自动分表组件,.NET 分表方案 ,分表架构与设计

    一.疑问&目的 1.1 分表使用场景 (1)可扩展架构设计,比如一个ERP用5年不卡,到了10就卡了因为数据太多了,这个时候很多人都是备份然后清空数据,这个工作大并且麻烦,以前的数据很难在使用 ...

  7. NPOI 导出excel 分表

    /// <summary> /// 由DataTable导出Excel[超出65536自动分表] /// </summary> /// <param name=" ...

  8. PostgreSQL 务实应用(三/5)分表复制

    问题的提出 在项目中,有些表的记录增长非常快,记录数过大时会使得查询变得困难,导致整个数据库处理性能下降.此时,我们会考虑按一定的规则进行分表存储. 常用的分表方式是按时间周期,如每月一张,每天一张等 ...

  9. tp5日志分表

    /** * 记录网站日志 * * @return bool */ public function record() { // 组装数据 $log = self::$param; $log[self:: ...

随机推荐

  1. Hadoop学习笔记(6) ——重新认识Hadoop

    Hadoop学习笔记(6) ——重新认识Hadoop 之前,我们把hadoop从下载包部署到编写了helloworld,看到了结果.现是得开始稍微更深入地了解hadoop了. Hadoop包含了两大功 ...

  2. Weibo Crawler in Action

    1.要写一个微博爬虫,得分开几个模块来做: (1)模拟登录 (2)模拟浏览 (3)针对短时间内大量访问而引起怀疑的禁止登陆解决方案 (4)其他 (1)模拟登陆模块 前提:要模拟登录,得首先知道在登录微 ...

  3. Android通过tcpdump抓包

    1. 手机要有root权限 2. 下载tcpdump   http://www.strazzere.com/android/tcpdump 3. adb push c:\wherever_you_pu ...

  4. binarySearch二分查找——Javascript实现

    在很早之前,我就写过了一篇也关于二分法的相关博文:JavaScript快排与原生sort的测试.当时是用二分法进行快速排序,其实和这次思路大致相当.二分查找最重要的一个条件,就是需要将数组先按照从小到 ...

  5. 【原创】用Pwnage + Redsnow 制作完美越狱固件

    原帖我发表在威锋论坛 现在貌似IOS 7.X系 大行其道,就算不是IOS7.X ,很多人也装着IOS 6.X系. 进入正文前首先介绍一下自己目前的"环境" 设备:iphone4 G ...

  6. mysql kill操作

    KILL语法 KILL [CONNECTION | QUERY] thread_id 每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运 ...

  7. UVaLive 6608 Cabin Baggage (水题)

    题意:给定四个数代表长宽高和重,问你是不是满足下面条件,长不高于56,宽不宽于45,高不高于25,或者总和不大于125,并且重量不高于7. 析:判断输出就好,注意这个题是或,不要想错了. 代码如下: ...

  8. 找不到类型或命名空间 datarowview

    在绑定数据时经常会用到这个句程序:<%# DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%# DataBinder ...

  9. 实现jsp网站添加到收藏夹

    var ctrl = (navigator.userAgent.toLowerCase()).indexOf('mac') != -1 ? 'Command/Cmd': 'CTRL';         ...

  10. new 运算符

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new