ThinkPHP数据库优化技巧清单
一 查询与索引优化
field('id,name,email')。WHERE YEAR(create_time)=2024),尽量改写为范围或等值条件。where('id','>',$lastId)->limit(N)),避免大偏移的 OFFSET。type(尽量避免 ALL)、key、rows、Extra 中的 Using filesort/Using temporary。二 关联与缓存策略
三 架构与连接管理
四 监控与数据库配置
EXPLAIN 与性能工具定位瓶颈。五 可直接复用的优化示例
$list = UserModel::with(['profile', 'orders'])
->where('status', 1)
->where('id', '>', $lastId)
->order('id', 'asc')
->limit(20)
->select();
$config = cache('config_dict');
if (!$config) {
$config = ConfigModel::where('status', 1)
->field('k,v')
->useIndex('idx_status') // 视库表支持情况使用
->select()
->column('v', 'k');
cache('config_dict', $config, 3600); // 1小时
}
// 开发/预发环境先分析
$sql = "SELECT u.id,u.name,o.total FROM user u
JOIN `order` o ON o.user_id = u.id
WHERE u.status = ? AND o.create_time >= ?
ORDER BY o.create_time DESC LIMIT 50";
Db::listen(function($sql, $runtime) {
// 记录或上报慢 SQL
if ($runtime > 0.2) {
// 告警/写入慢查询日志
}
});
$rows = Db::query($sql, [1, '2025-01-01']);
// 用 EXPLAIN 检查是否走索引、是否出现 Using filesort/Using temporary
// config/database.php
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => 'write.db.local',
'database' => 'app',
'username' => 'write',
'password' => '***',
'deploy' => 1, // 启用分布式
'rw_separate' => true, // 开启读写分离
'master_num' => 1,
'slave_no' => [], // 读库序号,可配多个
],
]