laravel 读写分离&跨库查询(链接双库)

**

读写分离

**
随着项目用户量、访问量的增长,对数据库进行读写分离可以有效的提升应用整体性能
记录下如何在 Laravel 中操作数据库。

不同的数据库来进行读写分离,在数据库中创建一个新的数据库用作写数据库,并将其配置到 config/database.php

'mysql' => [
   'driver' => 'mysql',
   'read' => [
       'host' => env('DB_HOST_READ', '127.0.0.1'),
       'database' => env('DB_DATABASE', 'ht_read'),
   ],
   'write' => [
       'host' => env('DB_HOST_WRITE', '127.0.0.1'),
       'database' => env('DB_DATABASE_WRITE', 'ht_write'),
   ],
   'port' => env('DB_PORT', '3306'),
   'username' => env('DB_USERNAME', 'root'),
   'password' => env('DB_PASSWORD', ''),
   'unix_socket' => env('DB_SOCKET', ''),
   'charset' => 'utf8mb4',
   'collation' => 'utf8mb4_unicode_ci',
   'prefix' => '',
   'strict' => true,
   'engine' => null,
],

跨库查询(链接双库)

连接双库这个因为目前的项目算是中等偏上的项目,而且还跟其他项目进行了打通融合,导致需要查询两个不同的数据库。配置两个数据库连接就行也比较简单:
config/database.php

//第一个数据库
'mysql' => [
   'driver' => 'mysql',
   'read' => [
       'host' => env('DB_HOST_READ', '127.0.0.1'),
       'database' => env('DB_DATABASE', 'ht_read'),
   ],
   'write' => [
       'host' => env('DB_HOST_WRITE', '127.0.0.1'),
       'database' => env('DB_DATABASE_WRITE', 'ht_write'),
   ],
   'port' => env('DB_PORT', '3306'),
   'username' => env('DB_USERNAME', 'root'),
   'password' => env('DB_PASSWORD', ''),
   'unix_socket' => env('DB_SOCKET', ''),
   'charset' => 'utf8mb4',
   'collation' => 'utf8mb4_unicode_ci',
   'prefix' => '',
   'strict' => true,
   'engine' => null,
],
// 第二个数据库
'mysql_saas' => [
   'driver' => 'mysql',
   'read' => [
       'host' => env('DB_HOST_READ', '127.0.0.1'),
       'database' => env('DB_DATABASE', 'saas_read'),
   ],
   'write' => [
       'host' => env('DB_HOST_WRITE', '127.0.0.1'),
       'database' => env('DB_DATABASE_WRITE', 'saas_write'),
   ],
   'port' => env('DB_PORT', '3306'),
   'username' => env('DB_USERNAME', 'root'),
   'password' => env('DB_PASSWORD', ''),
   'unix_socket' => env('DB_SOCKET', ''),
   'charset' => 'utf8mb4',
   'collation' => 'utf8mb4_unicode_ci',
   'prefix' => '',
   'strict' => true,
   'engine' => null,
],

查询的时候在自己项目的BaseModel里边指定数据库连接名就可以了

// 第一个库默认就是mysql所以第一个可以不用配置此项
class BaseModel extends Model
{

    protected $connection = 'mysql';
  }
  // 第二个库
class BaseModel extends Model
{

    protected $connection = 'mysql_saas';
  }
### Laravel 中实现分分表方案 在大型应用中,随着数据量的增长,单个数据库可能无法满足性能需求。此时可以通过分分表来提高系统的读写效率和响应速度。 #### 一、水平拆分策略 水平拆分是指按照一定的规则将同一张表的数据分布到多个物理存储单元上。对于Laravel而言,主要通过自定义查询构建器或ORM模型的方法来进行操作[^1]。 - **基于路由键的分片** 定义一个函数用于计算记录应该存放在哪个具体的子表内。例如按用户ID取模决定其归属的具体表格编号。 ```php protected function getShardId($userId){ return $userId % config('database.shards.count'); } ``` - **多连接配置** 配置`config/database.php`文件中的connections数组,增加额外的MySQL链接项以便于访问不同的实例。 ```php 'connections' => [ 'mysql_shard_0' => [...], 'mysql_shard_1' => [...], ] ``` 当执行SQL语句时指定使用的connection名称即可切换目标DB: ```php Model::on("mysql_shard_" . $shard_id)->find(1); ``` #### 二、垂直分割模式 如果某些字段很少被一起查询,则可以把它们分离出来形成新的实体类保存至独立的关系型数据库里;或者是把不常变动的历史档案迁移出去单独管理。 这种做法有助于减少每次请求所需扫描的数据范围从而加快处理速率并降低锁竞争概率。 #### 三、利用第三方组件辅助开发 目前市面上存在不少成熟的中间件产品可以帮助开发者更轻松地完成这项工作,比如: - `laradock/laradock`: 提供了一套完整的Docker环境设置工具链,方便测试阶段快速搭建多节点集群; - `weibo/phplint`: 支持复杂的分布式事务管理和数据中心同步机制等功能特性丰富的框架扩展包。 综上所述,在实际项目实施过程中往往需要综合考虑业务逻辑特点以及预期负载情况等因素灵活选用合适的技术手段组合运用以达到最佳效果[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值