上一篇
本文目录导读:
索引设计黄金法则
-- 错误示例:性别字段索引效果差 CREATE INDEX idx_gender ON users(gender); -- 正确示例:手机号字段索引 CREATE INDEX idx_phone ON users(phone);
(a,b,c)
仅支持a
、a,b
、a,b,c
查询,无法直接用于b,c
条件。 CREATE INDEX idx_covering ON orders(user_id, total_amount, status); -- 查询时无需访问主表 SELECT user_id, total_amount FROM orders WHERE status = 'shipped';
查询性能暴增技巧
EXPLAIN FORMAT=JSON
分析执行计划,重点关注: type
: 优先const
、ref
、range
,避免ALL
(全表扫描)。 Extra
: Using index
表示覆盖索引,Using filesort
需优化排序。 WHERE id > 10000
替代OFFSET
,减少扫描行数。 -- 错误示例:大表驱动小表 SELECT * FROM large_table l JOIN small_table s ON l.id = s.large_id; -- 正确示例:小表驱动大表 SELECT * FROM small_table s JOIN large_table l ON s.id = l.small_id;
基础配置(一主一从)
config/database.php
: 'mysql' => [ 'read' => [ 'host' => env('DB_HOST_READ', '127.0.0.1'), ], 'write' => [ 'host' => env('DB_HOST_WRITE', '127.0.0.1'), ], // 其他配置(数据库、用户名、密码等)... ],
DB_HOST_READ=192.168.1.100 DB_HOST_WRITE=192.168.1.101 DB_DATABASE=myapp DB_USERNAME=root DB_PASSWORD=secret
中间件动态切换(高级方案)
// app/Http/Middleware/ReadWriteSplitMiddleware.php public function handle($request, Closure $next) { $readConnection = 'mysql_read'; $writeConnection = 'mysql_write'; // 根据表名或路由参数切换连接 if ($request->is('api/read/*')) { DB::connection($readConnection)->setAsGlobal(); } else { DB::connection($writeConnection)->setAsGlobal(); } return $next($request); }
app/Http/Kernel.php
中添加路由中间件。 主从同步延迟解决方案
'mysql' => [ 'read' => [...], 'write' => [...], 'sticky' => true, // 关键配置 ],
pt-table-sync
或MySQL Replication
确保主从数据一致性。 资源控制器速成
php artisan make:controller Api/V1/ProductController --resource
// routes/api.php Route::apiResource('v1/products', 'Api\V1\ProductController');
请求验证与响应标准化
// app/Http/Requests/StoreProductRequest.php public function rules() { return [ 'name' => 'required|string|max:255', 'price' => 'required|numeric|min:0', ]; }
// 在AppServiceProvider中注册响应宏 Response::macro('api', function ($data, $status = 200) { return response()->json([ 'status' => $status >= 200 && $status < 300 ? 'success' : 'error', 'code' => $status, 'data' => $data, 'timestamp' => now()->toISOString(), ], $status); });
版本控制与兼容性
Route::prefix('v1')->group(function () { Route::apiResource('products', 'Api\V1\ProductController'); });
410 Gone
。 防御性编程
$request->validate()
或FormRequest
,防止SQL注入: $validated = $request->validate([ 'email' => 'required|email|unique:users', ]);
性能暴增技巧
$products = Cache::remember('products', 60, function () { return Product::all(); });
dispatch(new SendEmailJob($user));
监控与调优
.env文件示例
DB_HOST_READ=192.168.1.100 DB_HOST_WRITE=192.168.1.101 DB_DATABASE=myapp DB_USERNAME=root DB_PASSWORD=secret REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379
接口文件示例(UserController)
// app/Http/Controllers/Api/V1/UserController.php class UserController extends Controller { public function index() { $users = User::paginate(20); return response()->api($users); } public function store(StoreUserRequest $request) { $user = User::create($request->validated()); return response()->api($user, 201); } }
数据库配置示例(config/database.php)
'mysql' => [ 'read' => [ 'host' => env('DB_HOST_READ', '127.0.0.1'), ], 'write' => [ 'host' => env('DB_HOST_WRITE', '127.0.0.1'), ], 'driver' => 'mysql', 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, 'sticky' => true, // 启用sticky选项 ],
通过以上配置和代码示例,您可以在Laravel中实现高效的读写分离、编写规范的RESTful API,并确保数据库和接口性能达到最优!🚀
本文由 业务大全 于2025-08-26发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vds.7tqx.com/wenda/733035.html
发表评论