php实现mysql读写分离
实现MySQL读写分离的方法
在PHP中实现MySQL读写分离可以通过多种方式,以下是几种常见的方法:
使用PDO或MySQLi手动分离
通过代码逻辑判断SQL语句类型,将读操作和写操作分配到不同的数据库连接。
// 主库(写操作)
$writeDb = new PDO('mysql:host=master_host;dbname=dbname', 'username', 'password');
// 从库(读操作)
$readDb = new PDO('mysql:host=slave_host;dbname=dbname', 'username', 'password');
// 根据SQL类型选择连接
function getDbConnection($sql) {
$isWrite = preg_match('/^(INSERT|UPDATE|DELETE|REPLACE)/i', trim($sql));
return $isWrite ? $GLOBALS['writeDb'] : $GLOBALS['readDb'];
}
// 使用示例
$sql = "SELECT * FROM users";
$db = getDbConnection($sql);
$stmt = $db->query($sql);
使用中间件实现
通过MySQL代理中间件如MySQL Router、ProxySQL等自动实现读写分离,PHP应用只需连接中间件。
// 连接中间件
$db = new PDO('mysql:host=proxy_host;dbname=dbname', 'username', 'password');
// 所有SQL操作通过中间件自动路由
$sql = "SELECT * FROM users";
$stmt = $db->query($sql);
使用ORM框架支持
许多PHP ORM框架内置读写分离支持,例如Laravel的数据库配置:
// config/database.php
'mysql' => [
'driver' => 'mysql',
'read' => [
'host' => ['slave1', 'slave2'],
],
'write' => [
'host' => 'master',
],
'sticky' => true, // 写操作后短暂读主库
// 其他配置...
],
使用负载均衡DNS
为读库和写库配置不同的DNS记录,通过域名解析实现简单的读写分离。
// 写操作
$writeDb = new PDO('mysql:host=master.db.example.com;dbname=dbname', 'user', 'pass');
// 读操作
$readDb = new PDO('mysql:host=replica.db.example.com;dbname=dbname', 'user', 'pass');
注意事项
- 主从同步延迟问题:写后立即读可能导致数据不一致,需要特殊处理
- 连接池管理:避免频繁创建数据库连接
- 故障转移:从库故障时应有备用方案
- 事务处理:涉及事务的操作通常需要在主库执行
性能优化建议
- 对从库进行负载均衡,分散读压力
- 监控主从延迟,设置合理阈值
- 考虑使用缓存层减少数据库压力
- 重要业务考虑使用读写分离+分库分表组合方案
以上方法可根据实际项目需求和规模选择适合的实现方式。







