最近提到一个需求。需要记录app用户在使用app中的移动轨迹,即坐标值。每分钟上传一次XY坐标,有点类似跑步软件的描线轨迹。

不考虑app如何获取,反正api只要接受到坐标数据 就记录下来保存到数据库。接口接收3个参数X,Y,uid

1,建个新库。test 无论你是云DB还是同服务器下都可以

   'DB_CONFIG2'=>array(
'db_type'=>'mysql',
'db_user'=>'root',
'db_pwd'=>'',
'db_host'=>'localhost',
'db_port'=>'3306',
'db_name'=>'test',
),

  

2,建一个保存自增主键ID的表

CREATE TABLE `create_id` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='自增ID表';

3,附上主要代码

class TestAction extends Action {

    function _initialize(){
$this->db_2= M()->db(2,"DB_CONFIG2");
$this->union_sql="CREATE TABLE IF NOT EXISTS `%s` (
`id` int(11) NOT NULL,
`longitude` decimal(10,6) NOT NULL COMMENT '经度',
`latitude` decimal(10,6) NOT NULL COMMENT '纬度',
`addtime` int(11) NOT NULL COMMENT '添加时间',
`uid` int(11) NOT NULL COMMENT '用户ID',
PRIMARY KEY (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`%s`);";
$this->num_sql="CREATE TABLE IF NOT EXISTS `%s` (
`id` int(11) NOT NULL,
`longitude` decimal(10,6) NOT NULL COMMENT '经度',
`latitude` decimal(10,6) NOT NULL COMMENT '纬度',
`addtime` int(11) NOT NULL COMMENT '添加时间',
`uid` int(11) NOT NULL COMMENT '用户ID',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; } public function index() {
$uid=228;
$id = 10000099;
//$id = $this->create_id();//生成自增ID
//$uid=trim($_GET['uid']);
$union_table_name="point_".$uid;//总表表名
//新增记录分配分表名
$num_table_name= $this->get_data_table($uid,$id);
//分表名拼接
$union_table_string=$this->get_union_string($uid,$id);
//分表语句
$num_sql=sprintf($this->num_sql,$num_table_name);
$this->execute($num_sql);//新建分表
//总表语句
$union_sql=sprintf($this->union_sql,$union_table_name,$union_table_string);
echo $union_sql;
$re1= $this->execute($union_sql);//创建总表
echo ($this->db_2->getDbError()); //新增记录
$re=$this->execute("INSERT INTO $num_table_name (`id`, `longitude`, `latitude`, `addtime`, `uid`) VALUES ('$id', '1111.000000', '2222.000000', '22222', '$uid');"); if($re){
echo json_encode(array("status"=>1,"info"=>true));
}else{
echo json_encode(array("status"=>0,"info"=>false));
} } /**
* 创建一个自增主键
* @return int
*/
private function create_id(){
$sql = "insert into create_id (id) values('')";
$this->db_2->execute($sql);
return $this->db_2->getLastInsID();
} /**
* 获得表名
* @return string
*/
private function get_data_table($uid=null,$id=null){
if(empty($uid)||empty($id)){
return false;
}
return 'point_'.$uid.'_'.$this->get_table_num($id);
} /**
* 获得记录所在表序号
* @param $id 记录ID
* @param $max 表最大记录数
* @return int
*/
private function get_table_num($id,$max=10000000){
$num = ($id<$max) ? 1 : intval($id/$max); //整除取整,默认1
$add = ($id%$max)>0 && ($id>$max) ?1:0;//有余数,序号加1
return $num+$add;
} /**
* 判断表是否存在
*/
private function table_exit_create($table=null){
return $this->db_2->query("show tables like '%{$table}%'");
// return $this->db_2->query("desc {$table}");
} /**
* 建表
* @return bool
*/
private function execute($sql){
return $this->db_2->execute($sql);
} /**
* 生成拼接分表名字符串
* @param type $uid
* @param type $id
* @return string
*/
private function get_union_string($uid=null,$id=null){
$res = $this->table_exit_create("point_".$uid."_");
if($res){
if(count($res)>1){
$arr=array();
foreach($res as $v){
$arr[]=$v["Tables_in_test (%point_".$uid."_%)"];
}
$str= implode(',',$arr);
}else{
$str= "point_".$uid."_".$this->get_table_num($id);
}
}else{
$str= "point_".$uid."_".$this->get_table_num($id);
} return $str; }

4,分析

原理非常简单。

api接受到参数 -》主键表产生一个主键-》判断主键范围,分配分表名-》创建分表,并把这次接受参数插入分表(注意:所有分表的主键字段必须由主键表产生,确保唯一性)

-》创建总表(必须是ENGINE=MRG_MyISAM),把分表union关联起来,方便查询

分表必须MyISAM引擎,主键非自增

补充:1,注意完善参数验证 。UID真实性等

     2,每个分表我取1千万,更大的没有测试。

参考文章:百度来的http://soft.chinabyte.com/database/72/12620572.shtml

mysql大数据分表记录app用户的坐标数据的更多相关文章

  1. mysql大数据分表后查询

    当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度,举例说明: 1亿条数据,分100张表 1.首先创建100张表 $i=0;while($i<=99){echo "$n ...

  2. mysql大数据的分表

    在实际业务运作中,我们经常遇到一个表中数据量过大的问题,这样的话,问题就来了.如何将一个表中的数据均衡的放到多个表中? 我的建议是,新建一个表,但是只有一个自增的id字段,将其作为分表的依据.有大数据 ...

  3. MySql分区、分表和分库

    MySql分区.分表和分库 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 一些问题的解释: 1.为什么要分表和分区? 日常开发中 ...

  4. MySQL大数据分页的优化思路和索引延迟关联

    之前上次在部门的分享会上,听了关于MySQL大数据的分页,即怎样使用limit offset,N来进行大数据的分页,现在做一个记录: 首先我们知道,limit offset,N的时候,MySQL的查询 ...

  5. Mysql 之分库分表方案

    Mysql分库分表方案 为什么要分表 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. mysq ...

  6. MySQL+MyCat分库分表 读写分离配置

    一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : cor ...

  7. 面试官:说说Mysql数据库分库分表,并且会有哪些问题?

    之前一篇文章已经谈到了数据库集群之主从集群也就是读写分离,也提到了读写分离其实只是分担了访问的压力,但是存储的压力没有解决. 存储的压力说白了就是随着系统的演化,需求的增加,可能表的数量会逐渐增多,比 ...

  8. MySQL订单分库分表多维度查询

    转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询  MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...

  9. MySQL大数据量分页查询

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

随机推荐

  1. 【转】Android各大发布市场

    前言 如果只有一个或者少许的两三个Android市场,本文也没用存在的必要性,本文谨献给同在Android奋战的同仁. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnbl ...

  2. Linq to SQL 的增删改查操作

    Linq,全称Language Integrated Query,是C#语言的一个扩展,可以将数据查询直接集成到编程语言本身中. Linq分为查询语法和方法语法,说白了查询语法就是 from wher ...

  3. gerrit session expired 怎么解决,搜索未果

    gerrit session expired,怎么解决,搜索未果

  4. sum data

    $('.group_header').each(function(){ ; $(this).nextUntil('tr.group_header').find('.num').each(functio ...

  5. phpcms v9调用自定义字段的方法步骤

    代码如下:{loop $shigongtu $r}<img src="{$r[url]} " title="测试"/>{/loop} 2 首页,分页 ...

  6. eclipse构建maven+scala+spark工程 转载

    转载地址:http://jingpin.jikexueyuan.com/article/47043.html 本文先叙述如何配置eclipse中maven+scala的开发环境,之后,叙述如何实现sp ...

  7. 你年纪轻轻怎么这么"不讲理"

    今天在公交上遇到一出"精彩的打戏",这给我的12月份带来了一丝的"惊喜",1号就能让我碰到这样的事,看来这个月会惊喜不断啊!!!! 这精彩的戏是这样的,公交到了 ...

  8. [转]Java中Map的用法详解

    转载地址:http://www.zhixing123.cn/jsp/30113.html Map简介 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口取代 Dictio ...

  9. Java 枚举类

    如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...

  10. Java程序的编码规范

    所有的程序开发手册都包含了各种规则.一些习惯自由程序人员可能对这些规则很不适应,但是在多个开发人员共同写作的情况下,这些规则是必需的.这不仅仅是为了开发效率来考虑,而且也是为了后期维护考虑. 一.命名 ...