当对数据表进行水平分表之后,若要进行数据统计,往往需要对所有分表一起进行联合查询。在使用 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. git 路上的拦路虎 了解一下

    我们提交代码现在大部分都在用git  管理代码,有时候会遇到一些问题 用git 会发现一些问题 之前报了一些错误,没有记录,这次记录一下,顺便写一下解决方式: 输输入git remote add or ...

  2. 关于软件定义IT基础设施的未来,深信服是这么思考的

    在今年的深信服创新大会上,软件定义IT基础设施成为非常重要的议题之一,深信服与2,000余位客户的CIO和合作伙伴一起围绕IT基础设施在数字化时代中的作用与价值进行了深入的探讨. 此外,深信服还联合I ...

  3. 华为云备案服务全面升级,EI助力带来极速体验

    华为云备案"电子化核验"正式发布,备案更轻松.更快捷.自2019年9月12日起,华为云用户申请办理ICP备案可以通过华为云APP进行"ICP备案主体真实身份信息采集&qu ...

  4. Idea 2016 激活码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  5. mac eclipse maven tomcat 运行错误 tomcat HTTP Status 404

    在mac系统下安装好eclipse, maven以及tomcat, 之后运行一个web的helloworld项目,出现错误 tomcat HTTP Status 404. 查看eclipse cons ...

  6. 二分查找-Java版

    /** * * 二分查找算法 * * * * @param srcArray 有序数组 * * @param target 查找元素 * * @return srcArray数组下标,没找到返回-1 ...

  7. openstack网络(二)

    连接物理服务器 单网卡 多网卡 跨主机安装网络服务 使用单个控制节点安装 使用专用网络节点安装 连接物理服务器 每个物理主机所需的网卡数量取决于云平台使用领域,组织的安全性和性能要求以及硬件的可用性. ...

  8. 【简明翻译】Hibernate 5.4 Getting Started Guide 官方入门文档

    前言 最近的精力主要集中在Hibernate上,在意识到Hibernate 5 的中文资料并不多的时候,我不得不把目光转向Hibernate的官方doc,学习之余简要翻一下入门文档. 原文地址:htt ...

  9. Python如何实现微信群万人同步直播?

    很多人传言微信网页版(https://wx.qq.com/)接口已经被封了,所以所有的微信都不能登录网页版,这是错误的. 2019年7月微信对网页版微信进行了动态安全策略调整,导致一大批微信号不能登录 ...

  10. JS中的防抖和节流

    JS-防抖和节流 在进行窗口的resize.scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕.此时我们可以采用debounce(防抖)和 ...