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

  • 相关阅读:
    Hbase架构与原理(转)
    Hbase的表结构中rowkey的设计---避免热点问题
    mysql之my.cnf详解
    MongoDB CPU利用率很高,怎么破(转)
    数据库设计(2/9):域,约束和默认值(Domains, Constraints and Defaults)
    数据库设计(1/9):数据元(Data Elements)
    SQL Server安全(11/11):审核(Auditing)
    VARCHAR列上的索引
    SQL Server 2016里的sys.dm_exec_input_buffer
    在SQL Server里禁用聚集索引——真的好么?
  • 原文地址:https://www.cnblogs.com/imzhi/p/laravel-query-sharding.html
Copyright © 2020-2023  润新知