此刻,我按以下方式初始化数据库:
$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中初始化数据库连接?
我需要从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索引,已经存在)