Laravel 框架对于分表进行统计合并查询的思路
当对数据表进行水平分表之后,若要进行数据统计,往往需要对所有分表一起进行联合查询。在使用 Laravel 框架时,可以利用 Model 类的 setTable 方法对于多个表进行合并查询。
举个例子,假设 users 表水平拆分为 16 个表,users_0、users_1、users_2……一直到 users_f,这几个表都有相同的结构,使用 SQL 的 UNION ALL 合并查询所有表的结果集,然后调用 Model 类的 setTable 方法,把结果集的别名赋值给 Model 类的 table 属性,这样就能够对 users 所有表进行联合查询操作了。具体请参考下这篇文章的例子。
<?php class User extends Model
{
public function setUnionAllTable()
{
$sql =<<<'EOT'
SELECT * FROM users_0
UNION ALL
SELECT * FROM users_1
UNION ALL
SELECT * FROM users_2
UNION ALL
SELECT * FROM users_3
UNION ALL
SELECT * FROM users_4
UNION ALL
SELECT * FROM users_5
UNION ALL
SELECT * FROM users_6
UNION ALL
SELECT * FROM users_7
UNION ALL
SELECT * FROM users_8
UNION ALL
SELECT * FROM users_9
UNION ALL
SELECT * FROM users_a
UNION ALL
SELECT * FROM users_b
UNION ALL
SELECT * FROM users_c
UNION ALL
SELECT * FROM users_d
UNION ALL
SELECT * FROM users_e
UNION ALL
SELECT * FROM users_f
EOT;
return $this->setTable(DB::raw("({$sql}) AS users_all"));
}
}
除了上面的方法,将合并查询写在 PHP 代码里,也可以写到 SQL 里。具体的做法是新增一个视图,视图的定义就是 UNION ALL 合并查询的 SQL 语句,仍旧以上面的 users 表为例子。
CREATE VIEW users_all AS
SELECT * FROM users_0
UNION ALL
SELECT * FROM users_1
UNION ALL
SELECT * FROM users_2
UNION ALL
SELECT * FROM users_3
UNION ALL
SELECT * FROM users_4
UNION ALL
SELECT * FROM users_5
UNION ALL
SELECT * FROM users_6
UNION ALL
SELECT * FROM users_7
UNION ALL
SELECT * FROM users_8
UNION ALL
SELECT * FROM users_9
UNION ALL
SELECT * FROM users_a
UNION ALL
SELECT * FROM users_b
UNION ALL
SELECT * FROM users_c
UNION ALL
SELECT * FROM users_d
UNION ALL
SELECT * FROM users_e
UNION ALL
SELECT * FROM users_f;
视图可以看作虚拟的表,在 Laravel 中创建对应的 Model 类(如:UserAll.php),在统计查询时直接使用新建的 UserAll 类来进行操作就行了。
总结:原理都是使用 UNION ALL 合并查询结果集,具体是写在 PHP 代码里还是写在 SQL 里,就看个人选择了。
Laravel 框架对于分表进行统计合并查询的思路的更多相关文章
- 分库分表后跨分片查询与Elastic Search
携程酒店订单Elastic Search实战:http://www.lvesu.com/blog/main/cms-610.html 为什么分库分表后不建议跨分片查询:https://www.jian ...
- Laravel框架中Form表单Get请求搜索(在此感谢[https://simon8.com])
首先看一下HTML部分的Form表单 <form role="search" method="get" id="searchform" ...
- ORM框架对分表分库之分库和分表指定不同的字段
ORM框架分库分表已实现了 只分表(根据指定字段) 点我查看demo 只分库(根据指定字段) 点我查看demo 既分库又分表(根据相同的字段) 点我查看demo 上面几点之前我在博客中已经写了使用介绍 ...
- NetCore框架WTM的分表分库实现
介绍 本期主角: ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 WTM WalkingTec.Mvvm框架(简称W ...
- MySQL的分表与分区
MySQL分表分区是解决大数据量导致MySQL性能低下的两种方法. 什么是MySQL分表 从表面意思上看,MySQL分表就是将一个表分成多个表,数据和数据结构都有可能会变.MySQL分表分为垂直分表和 ...
- 001---mysql分库分表
mysql分库分表 一.整体的切分方式 1.分库分表:即数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果 2.数据的切分根 ...
- mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表
之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...
- .Net下的分库分表帮助类——用分库的思想来分表
简介 在大型项目中,我们会遇到分表分库的情景. 分库,将不同模块对应的表拆分到对应的数据库下,其实伴随着公司内分布式系统的出现,这个过程也是自然而然就发生了,对应商品模块和用户模块, ...
- 数据库分库分表和带来的唯一ID、分页查询问题的解决
需求缘起(用一个公司的发展作为背景) 1.还是个小公司的时候,注册用户就20w,每天活跃用户1w,每天最大单表数据量就1000,然后高峰期每秒并发请求最多就10,此时一个16核32G的服务器,每秒请求 ...
随机推荐
- 安装软件包的三种方法、RPM包介绍、rpm、yum工具用法、yum搭建本地仓库
第5周第3次课(4月18日) 课程内容: 7.1 安装软件包的三种方法7.2 rpm包介绍7.3 rpm工具用法7.4 yum工具用法7.5 yum搭建本地仓库 7.1 安装软件包的三种方法 rpm工 ...
- 正则grep 使用介绍
第6周第3次课(4月25日) 课程内容: 9.1 正则介绍_grep上9.2 grep中9.3 grep下扩展把一个目录下,过滤所有*.php文档中含有eval的行grep -r --include= ...
- Spring Securtiy 认证流程(源码分析)
当用 Spring Security 框架进行认证时,你可能会遇到这样的问题: 你输入的用户名或密码不管是空还是错误,它的错误信息都是 Bad credentials. 那么如果你想根据不同的情况给出 ...
- mysql主从架构搭建
1.配置文件,开启二进制日志 vim /etc/my.cnf 在mysql下增加如下内容 server-id= log-bin=mysql-bin relay-log=mysql-relay 2.登录 ...
- Multi-Camera Coordination and Control in Surveillance Systems: A Survey 阅读笔记
原文: Natarajan, Prabhu, Pradeep K. Atrey, and Mohan Kankanhalli. "Multi-camera coordination and ...
- 【我的物联网成长记8】超速入门AT指令集【华为云技术分享】
[摘要] 在物联网中,AT命令集可用于控制&调测设备.通信模块入网等.本文为您介绍NB-IoT常用的AT命令集及其调测工具. 什么是AT指令集 AT命令,用来控制TE(Terminal Equ ...
- Frida用法之函数操作
Frida接口功能介绍 Frida是个so级别的hook框架,它可以帮助开发.安全人员对指定的进程的so模块进行分析.它主要提供了功能简单的Python接口和功能丰富的JS接口,使得hook函数和 ...
- 报错 Please make sure you have the correct access rights and the repository exists (git 添加ssh密钥 )
1.设置Git的user name和email $ git config --global user.name "wubaiwan" $ git config --global u ...
- HDU3710 Battle over Cities(最小生成树+树链剖分+倍增+线段树)
Battle over Cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- Spring Boot 外部化配置(一)- Environment、ConfigFileApplicationListener
目录 前言 1.起源 2.外部化配置的资源类型 3.外部化配置的核心 3.1 Environment 3.1.1.ConfigFileApplicationListener 3.1.2.关联 Spri ...