• 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 里,就看个人选择了。

  • 相关阅读:
    继续搞我的linux
    MySQL 开始
    我的小程序终于完工
    列表页 编辑页 删除页
    开发 记账小程序研发
    vue使用饿了么element-ui框架中的上传组件进度条无法使用,:on-progress钩子无法触发的原因
    移动端调试神器vConsole
    全栈高级web前端工程师的必经之路
    在vue中使用elementUI饿了么框架使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结
    GitBook的使用方式,快速创建网页文档
  • 原文地址:https://www.cnblogs.com/imzhi/p/laravel-query-sharding.html
Copyright © 2020-2023  润新知