当对数据表进行水平分表之后,若要进行数据统计,往往需要对所有分表一起进行联合查询。在使用 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 框架对于分表进行统计合并查询的思路的更多相关文章

  1. 分库分表后跨分片查询与Elastic Search

    携程酒店订单Elastic Search实战:http://www.lvesu.com/blog/main/cms-610.html 为什么分库分表后不建议跨分片查询:https://www.jian ...

  2. Laravel框架中Form表单Get请求搜索(在此感谢[https://simon8.com])

    首先看一下HTML部分的Form表单 <form role="search" method="get" id="searchform" ...

  3. ORM框架对分表分库之分库和分表指定不同的字段

    ORM框架分库分表已实现了 只分表(根据指定字段) 点我查看demo 只分库(根据指定字段) 点我查看demo 既分库又分表(根据相同的字段) 点我查看demo 上面几点之前我在博客中已经写了使用介绍 ...

  4. NetCore框架WTM的分表分库实现

    介绍 本期主角: ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 WTM WalkingTec.Mvvm框架(简称W ...

  5. MySQL的分表与分区

    MySQL分表分区是解决大数据量导致MySQL性能低下的两种方法. 什么是MySQL分表 从表面意思上看,MySQL分表就是将一个表分成多个表,数据和数据结构都有可能会变.MySQL分表分为垂直分表和 ...

  6. 001---mysql分库分表

    mysql分库分表 一.整体的切分方式 1.分库分表:即数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果 2.数据的切分根 ...

  7. mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  8. .Net下的分库分表帮助类——用分库的思想来分表

    简介     在大型项目中,我们会遇到分表分库的情景.      分库,将不同模块对应的表拆分到对应的数据库下,其实伴随着公司内分布式系统的出现,这个过程也是自然而然就发生了,对应商品模块和用户模块, ...

  9. 数据库分库分表和带来的唯一ID、分页查询问题的解决

    需求缘起(用一个公司的发展作为背景) 1.还是个小公司的时候,注册用户就20w,每天活跃用户1w,每天最大单表数据量就1000,然后高峰期每秒并发请求最多就10,此时一个16核32G的服务器,每秒请求 ...

随机推荐

  1. 系统默认的alert弹出框总会带有域名

    最近在开发Hybrid APP时发现用系统默认的alert弹出框总会带有域名,用户体验就比较不好了.想了一种办法来解决就是覆盖alert的方法. (function(){       window.a ...

  2. Codeforces Round #451 (Div. 2) A B C D E

    Codeforces Round #451 (Div. 2) A Rounding 题目链接: http://codeforces.com/contest/898/problem/A 思路: 小于等于 ...

  3. Flask开发VIP版HttpServer #华为云·寻找黑马程序员#

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  4. 了解 MongoDB 看这一篇就够了【华为云分享】

    目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...

  5. 自然语言处理(NLP) - 数学基础(1) - 总述

    正如我在<2019年总结>里说提到的, 我将开始一系列自然语言处理(NLP)的笔记. 很多人都说, AI并不难啊, 调现有库和云的API就可以啦. 然而实际上并不是这样的. 首先, AI这 ...

  6. [TimLinux] Linux shell获取进程pid

    调用脚本时,获取进程PID: (/this/is/a/script/file.sh > /out/to/log.txt & echo $!) & 脚本内部,获取进程PID: ec ...

  7. HDU3247 Resource Archiver (AC自动机+spfa+状压DP)

    Great! Your new software is almost finished! The only thing left to do is archiving all your n resou ...

  8. 牛客练习赛32 B题 Xor Path

    链接:https://ac.nowcoder.com/acm/contest/272/B来源:牛客网 题目描述 给定一棵n个点的树,每个点有权值.定义表示  到  的最短路径上,所有点的点权异或和. ...

  9. HDU3849-By Recognizing These Guys, We Find Social Networks Useful(无向图的桥)

    By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others)     ...

  10. Python3 类与对象之王者荣耀对战小游戏

    王者荣耀对战小游戏 # 定义英雄: 亚瑟 class Arthur: hero_type = 'Tank' def __init__(self, attack_value=164, armor=98, ...