【发布时间】:2010-06-23 08:01:23
【问题描述】:
对于我正在编写的当前应用程序,我选择将所有数据库功能放在一个类中,因为它允许我将数据库代码远离业务逻辑,并在需要切换时轻松替换数据库代码到另一个 DBMS。但是,最近我的数据库类变得相当大(信息编辑:大约 53k),由于它的体积,我担心解析这个文件的速度,因为它通常必须针对每个请求进行解析。
通常在任何给定时间只进行一种或两种不同“类型”的数据库调用(例如,用户系统调用、资产系统调用、地图系统调用、会话系统调用等),所以一个选项 I正在考虑将任务分解为一系列数据库对象“切片”,然后根据函数请求在运行时动态加载这些对象。
另一方面,我担心这样做会(a)导致内存中的大量并行执行(即每个切片现在都有一个查询方法、一个独立的查询日志等)以及强迫我修改所有现有代码以指向新的、更小的对象或(b)导致相对性能损失,因为我在此功能中反向破解以使用已编写的代码(例如,让每个切片指向父的查询功能以及突然在整个地方使用 __call 而不是直接方法访问所招致的性能损失)。
在这种情况下,更正确的做法是什么?
编辑了解更多信息:该文件大约 53kb,目前大约有 2,350 行(尚未完成),尽管这可能被认为是有偏差的,因为我使用扩展的 SQL 模型来提高可读性,例如
SELECT
foo,
bar,
baz
FROM
someTable st
LEFT JOIN someOtherTable sot
ON st.id = sot.stId
WHERE
cond > otherCond
有 70 个查询函数,每个执行一些独特的任务,几乎没有重叠(如果我需要两个惊人相似的结果集,我可以简单地忽略我每次不需要的并重复使用相同的查询)。
编辑:示例函数:
public function alarm_getActiveAlarmsByAsset($tier, $id) {
if ( !Redacted::checkNumber($tier, $id)
|| $id < 0
|| $tier > Redacted::ASSET_LOWEST_TIER
|| $tier < Redacted::ASSET_TIER_CUSTOMER
) {
return false;
}
$sql = "
SELECT
alarmId,
alarmTime,
server,
source,
reason,
train,
server_sites.siteId AS `siteId`
FROM
alarm_alarms
";
$join = '';
switch ($tier) {
case Redacted::ASSET_TIER_CUSTOMER:
$join = '
LEFT JOIN red_campus
ON red_campus.campId = red_site.campId
';
case Redacted::ASSET_TIER_CAMPUS:
$join = '
LEFT JOIN red_site
ON red_site.siteId = server_sites.siteId
' . $join;
case Redacted::ASSET_TIER_SITE:
$join = '
LEFT JOIN server_sites
ON server_sites.servId = alarm_alarms.server
' . $join;
}
$table = isset(self::$dbTierMap[$tier + 1]) ? self::$dbTierMap[$tier + 1]['table'] : 'server_sites';
$field = isset(self::$dbTierMap[$tier + 1]) ? self::$dbTierMap[$tier + 1]['parent'] : 'site';
$sql .= $join . "
WHERE
ackId IS NULL
AND {$table}.{$field}Id = {$id}
";
$r = $this->query($sql);
if (!$r) {
return false;
}
$alarms = array();
while ($alarm = mysql_fetch_assoc($r)) {
$alarms[] = $alarm;
}
return $alarms;
}
【问题讨论】:
-
“相当大”到底有多大,难道没有可能通过更好地重用代码在内部优化类吗?
-
~53kb,~2350 行,虽然我使用扩展 SQL 时可能会认为行数有偏差 - 将更新帖子。
-
我是否理解正确,您的应用程序对每个唯一查询都有单独的函数?
-
是的,有一个单独的函数来读取每个查询,将其结果解析为一致且有意义的格式,并将其返回给调用模块;我真的想把 SQL 排除在这个主类之外,所以它完全存在于一个地方。
-
那么我必须问,您是否考虑过尝试自动构建这些查询?例如,通过使用 Model-View-Controller 架构,特别是结合 ORM 库,如Doctrine
标签: php performance oop optimization