mysql大数据分表记录app用户的坐标数据
最近提到一个需求。需要记录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用户的坐标数据的更多相关文章
- mysql大数据分表后查询
当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度,举例说明: 1亿条数据,分100张表 1.首先创建100张表 $i=0;while($i<=99){echo "$n ...
- mysql大数据的分表
在实际业务运作中,我们经常遇到一个表中数据量过大的问题,这样的话,问题就来了.如何将一个表中的数据均衡的放到多个表中? 我的建议是,新建一个表,但是只有一个自增的id字段,将其作为分表的依据.有大数据 ...
- MySql分区、分表和分库
MySql分区.分表和分库 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 一些问题的解释: 1.为什么要分表和分区? 日常开发中 ...
- MySQL大数据分页的优化思路和索引延迟关联
之前上次在部门的分享会上,听了关于MySQL大数据的分页,即怎样使用limit offset,N来进行大数据的分页,现在做一个记录: 首先我们知道,limit offset,N的时候,MySQL的查询 ...
- Mysql 之分库分表方案
Mysql分库分表方案 为什么要分表 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. mysq ...
- MySQL+MyCat分库分表 读写分离配置
一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : cor ...
- 面试官:说说Mysql数据库分库分表,并且会有哪些问题?
之前一篇文章已经谈到了数据库集群之主从集群也就是读写分离,也提到了读写分离其实只是分担了访问的压力,但是存储的压力没有解决. 存储的压力说白了就是随着系统的演化,需求的增加,可能表的数量会逐渐增多,比 ...
- MySQL订单分库分表多维度查询
转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询 MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...
- MySQL大数据量分页查询
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
随机推荐
- delphi 图像旋转
网络搜集的 觉得有用的拿去吧 速度不错呢 //旋转90° procedure Rotate(Bitmap: TBitmap); type THelpRGB = packed record rgb: ...
- DOM和DHTML等,复习总结
DOM(Document Object Model),文件对象模型.HTML(HyperText Markup Language),超文本标记语言.HTML的超类:Node->Document: ...
- 学习Linux系列--布署常用服务
本系列文章记录了个人学习过程的点点滴滴. 回到目录 10.mediawiki 知名开源维基框架,我用来构建自己的知识库. 在mediawiki中新建一个http.conf文件 sudo vim /op ...
- mysql优化一 之 优化内容概述及开启慢查日志的相关配置
1-1数据库优化的目的 首先是为了避免出现页面访问错误(基本有三种) (1)由于数据库连接timeout产生的页面5XX错误 (2)由于慢查询造成页面无法加载 (3)由于阻塞造成的数据无法提交 其次: ...
- JAVA中取余(%)规则和介绍
在java中%的含义为取余. java :a%b 数学公式a%b=a-(a/b)*b
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...
- Ubuntu 16.04 LTS 安装 Nginx/PHP 5.6/MySQL 5.7 (LNMP) 与Laravel
Ubuntu 16.04 LTS 安装 Nginx/PHP 5.6/MySQL 5.7 (LNMP) 与Laravel 1.MySQL安装[安装 MariaDB]MariaDB是MySQL的一个分支首 ...
- centos6.6_64位操作系统安装时候出现kernel panic - not syncing: Attempted to kill init 解决办法
最近在VM上安装centos时候经常被这个问题虐,后来进入单用户模式在 kernel /vmlinuz-XXXXro root=/dev/vogroup00/logvol00 rhgb quie ...
- ooize的使用01
1.常用的调度框架 1.1 linux crontab 1.1.1 编写一个crontab,每一分钟向/opt/data/cronlogs文件中添加当前时间 crontab -e
- python之路4
迭代器&生成器 迭代器: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后 ...