laravel10连接多个sql server数据库,查询性能太低的问题
1. 运行环境
服务器和数据库都在国外,但在同一个区域.
1). 当前使用的 Laravel 版本?
laravel10.0
2). 当前使用的 php/php-fpm 版本?
PHP 版本:8.2.25
php-fpm 版本:
3). 当前系统
debian12
docker25.0.5
4). 业务环境
在测试环境,并没有使用任何负载均衡,因为内部在测试
5). 相关软件版本
使用Nginx1.25.2
数据库: sql server 2008
2. 问题描述?
在一个查询中, 使用了三个数据库
第一次查询时, 都要创建一次数据库连接
三个数据库, 就要创建三次连接
而且当查询结束后, 停几秒后再查询, 好像又要创建创建连接
导致查询的效率很慢
之前这个功能是用.net开发的, 整个查询下来才400毫秒左右
但现在使用laravel10翻写后, 每次查询下来, 短的在3秒左右, 时间长的话, 又时可以达到 10秒以上了.(sql语句都没有问题, 不牵扯索引和优化, 和.net使用的同一个数据库)
使用pdo_sqlsqv,sqlsqv
本想着使用持久连接, 但好像不支持这个设置
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('SQLSRV_DATABASE_URL'),
'host' => env('SQLSRV_DB_HOST', 'localhost'),
'port' => env('SQLSRV_DB_PORT', '1433'),
'database' => env('SQLSRV_DB_DATABASE', 'forge'),
'username' => env('SQLSRV_DB_USERNAME', 'forge'),
'password' => env('SQLSRV_DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'encrypt' => env('DB_ENCRYPT', 'yes'),
'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
'options' => [
\PDO::ATTR_EMULATE_PREPARES => false, // 禁用模拟预处理
\PDO::ATTR_PERSISTENT => true, // 开启持久连接
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, // 设置错误模式为抛出异常
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, // 设置默认的 fetch 模式
\PDO::SQLSRV_ATTR_QUERY_TIMEOUT => 30, // 设置查询超时时间
\PDO::SQLSRV_ATTR_DIRECT_QUERY => true, // 根据需要启用直接查询模式
]
],
增加\PDO::ATTR_PERSISTENT => true设置后会报错:
SQLSTATE[IMSSP]: An unsupported attribute was designated on the PDO object.
3. 您期望得到的结果?
期望能提高查询速度, 尽量能控制在1秒左右, 不知道有什么其他方法可以提高效率
4. 您实际得到的结果?
使用laravel10翻写后, 每次查询下来, 短的在3秒左右, 时间长的话, 又时可以达到 10秒以上了.(sql语句都没有问题, 不牵扯索引和优化, 和.net使用的同一个数据库)
推荐文章: