最近提到一个需求。需要记录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. C# 不重复的随机数

    public int RabdomNumber() { num = new Random(Guid.NewGuid().GetHashCode()).Next(0, 40); return num; ...

  2. Android Monkey测试(转载)

    Monkey是一款通过命令行来对我们APP进行测试的工具,可以运行在模拟器里或真机上.它向系统发送伪随机的用户事件流,实现对正应用程序进行压力测试. 官方介绍 :https://developer.a ...

  3. .Net发出图片Request请求

    Stream reader = null; //可能是外部链接 if (imgUrl.ToLower().StartsWith("http://")) { var request ...

  4. Swift_UI_UIButton

    class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 1. 自定义 ...

  5. WebService错误:使用 XSL 样式表无法查看 XML 输入

    在浏览器中输入URL: 'http://localhost/test.aspx'  出现下面错误提示信息: 无法显示 XML 页. 使用 XSL 样式表无法查看 XML 输入.请更正错误然后单击 刷新 ...

  6. Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据

    今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...

  7. DNS-3

  8. 开发客户端软件时,出现System.Windows.Markup.XamlParseException错误

    开发客户端软件时,出现System.Windows.Markup.XamlParseException错误,通过查看错误消息,发现TCPIP的一个COM组件在安装软件过程中被删除了,重新注册了一下TC ...

  9. input 的blur事件之后button的onclick事件不执行解决方案

    最近发现网页程序中有个BUG,就是在input标签输入框中输入完数据后,直接点击“取消” 按钮的时候.出现网页崩死的情况: 经过小主酸菜我,各种方法的尝试后,找到一个初步可以解决的方案,在这里分享给大 ...

  10. 使用discovery板上的st-link给别的板子下载

    discovery板上的6pin swd接口 20pin 的jtag 接线: 6 20 def 1 1 目标vdd 2 9  swclk(PA14) 3 20 gnd 4 7  swdio(PA13) ...