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 ...
随机推荐
- C# 不重复的随机数
public int RabdomNumber() { num = new Random(Guid.NewGuid().GetHashCode()).Next(0, 40); return num; ...
- Android Monkey测试(转载)
Monkey是一款通过命令行来对我们APP进行测试的工具,可以运行在模拟器里或真机上.它向系统发送伪随机的用户事件流,实现对正应用程序进行压力测试. 官方介绍 :https://developer.a ...
- .Net发出图片Request请求
Stream reader = null; //可能是外部链接 if (imgUrl.ToLower().StartsWith("http://")) { var request ...
- Swift_UI_UIButton
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 1. 自定义 ...
- WebService错误:使用 XSL 样式表无法查看 XML 输入
在浏览器中输入URL: 'http://localhost/test.aspx' 出现下面错误提示信息: 无法显示 XML 页. 使用 XSL 样式表无法查看 XML 输入.请更正错误然后单击 刷新 ...
- Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据
今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...
- DNS-3
- 开发客户端软件时,出现System.Windows.Markup.XamlParseException错误
开发客户端软件时,出现System.Windows.Markup.XamlParseException错误,通过查看错误消息,发现TCPIP的一个COM组件在安装软件过程中被删除了,重新注册了一下TC ...
- input 的blur事件之后button的onclick事件不执行解决方案
最近发现网页程序中有个BUG,就是在input标签输入框中输入完数据后,直接点击“取消” 按钮的时候.出现网页崩死的情况: 经过小主酸菜我,各种方法的尝试后,找到一个初步可以解决的方案,在这里分享给大 ...
- 使用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) ...