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使用的同一个数据库)

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

能否通过再database配置中创建3个连接方式sqlsrv,sqlsrv1,sqlsrv2,在Model中设置不同的connection,这样用三个模型去查询是不是会更快一些?

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!