小编lot*_*lot的帖子

如何在Phalcon中正确初始化数据库连接

此刻,我按以下方式初始化数据库:

$di->set('db', function() use ($config){
    return new \Phalcon\Db\Adapter\Pdo\Mysql(
        array(
            "host" => $config->database->host,
            "username" => $config->database->username,
            "password" => $config->database->password,
            "dbname" => $config->database->name
        )
    );
});
Run Code Online (Sandbox Code Playgroud)

但是当mysql凭据错误或数据库不存在时,Phalcon返回空白页面而没有任何错误消息.这种情况真的很头疼,因为登录/密码/主机中的小错误导致几乎无法追踪的错误.

我认为Pdo构造函数在这种情况下会停止PHP代码执行.

那么当你希望网站告诉你数据库的问题时,如何在Phalcon中初始化数据库连接?

php mysql pdo phalcon

7
推荐指数
1
解决办法
4704
查看次数

为什么子查询和连接速度如此之慢

我需要从BUNDLES表中选择具有多个SAP_STATE_ID值之一的行.这些值取决于是否应该导出相应的SAP状态.

此查询运行速度非常快(SAP_STATE_ID字段上有索引) -

SELECT b.* FROM BUNDLES b WHERE b.SAP_STATE_ID IN (2,3,5,6)
Run Code Online (Sandbox Code Playgroud)

但是......我想动态获取ID列表,如下所示:

SELECT b.* FROM BUNDLES b 
WHERE b.SAP_STATE_ID IN 
(SELECT s.SAP_STATE_ID FROM SAP_STATES s WHERE s.EXPORT_TO_SAP = 1)
Run Code Online (Sandbox Code Playgroud)

而且,这个查询突然花费了太多时间.我希望SQL服务器首先运行子查询(它不依赖于主查询中的任何内容),然后像我的第一个例子一样运行整个事情.我试图重写它以使用连接而不是子查询:

SELECT b.* FROM BUNDLES b 
JOIN SAP_STATES s ON (s.SAP_STATE_ID = b.SAP_STATE_ID) 
WHERE s.EXPORT_TO_SAP = 1
Run Code Online (Sandbox Code Playgroud)

但它的性能相同.它似乎正在为BUNDLES表的每一行运行子查询或类似的东西.我在阅读执行计划方面不是很熟练,但我试过了.它说81%的成本用于扫描BUNDLES的主键索引(我不知道为什么它应该这样做,有BUNDLE_ID字段定义为PRIMARY KEY,但它根本没有出现在查询中...... )

有没有人解释为什么SQL服务器如此"愚蠢"?有没有办法以良好的性能实现我想要的但不需要提供SAP_STATE_ID的静态列表?

表和相关索引的脚本 - http://mab.to/xbYiI0wKj

子查询版本的执行计划 - http://mab.to/8Qh6gpdYZ

带连接的版本的查询计划 - http://mab.to/YCqeGCUbr

(出于某种原因,这两个计划看起来是一样的,都建议创建BUNDLES.SAP_STATE_ID索引,已经存在)

sql sql-server join

6
推荐指数
1
解决办法
1029
查看次数

标签 统计

join ×1

mysql ×1

pdo ×1

phalcon ×1

php ×1

sql ×1

sql-server ×1