总体思路 从应用层到数据库层再到基础设施层协同优化,才能稳定提升查询速度。下面按优先级给出可落地的做法与示例。
数据库与索引优化
// 只查必要字段 + 分页
$list = Db::name('users')
->field('id, name, email, status')
->where('status', 1)
->order('create_time DESC')
->paginate(20);
// 为关联字段与常用筛选条件建立索引(迁移或DBA执行)
// CREATE INDEX idx_user_id ON orders(user_id);
// CREATE INDEX idx_type_status ON users(type, status);
以上做法能显著减少扫描行数、降低 I/O 与网络开销。查询与 ORM 优化
// 推荐:预加载关联
$users = User::with(['posts', 'profile'])->select();
// 不推荐:N+1
// foreach ($users as $u) { $u->posts; }
// 原生 SQL + 参数绑定
$sql = "SELECT id, name FROM users WHERE status = :status AND age > :age";
$rows = Db::query($sql, ['status' => 1, 'age' => 18]);
// 预处理示例
$stmt = Db::getInstance()->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
$row = $stmt->fetchAll();
缓存策略
// 缓存 60 秒
$user = User::where('id', 1)->cache(60)->find();
// 自定义缓存键与有效期
$list = User::cache('user_list', 3600)->select();
// 数据变更后主动清除
User::clearCache('user_list');
诊断与运行时优化
// config/database.php
'log' => [
'type' => 'console', // 或 file
'level' => ['sql'],
];
// 代码中监听
Db::listen(function($sql, $runtime, $master) {
// $runtime 单位:秒
if ($runtime > 0.5) {
// 记录或告警慢 SQL
echo $sql . ' [RunTime: ' . $runtime . 's]' . PHP_EOL;
}
});