【发布时间】:2014-08-14 01:55:17
【问题描述】:
在使用 OOP 时,您一般会如何优化如下类的数据库性能,同时仍然遵循 DRY 原则?
class AccountExampleClass
{
private $_mysqli;
// Current account ID
private $_accountId;
public function loginActions()
{
// Stuff to do on login
// ...
// Store the current time in last_activity and last_login, using
// two queries instead of one.
$this->updateLastActivity();
$this->_updateLastLogin();
}
// Run on every pageview
public function updateLastActivity()
{
$this->_mysqli->query("UPDATE `accounts` SET `last_activity` = NOW()
WHERE `id` = $this->_accountId LIMIT 1");
}
// Only run on login
private function _updateLastLogin()
{
$this->_mysqli->query("UPDATE `accounts` SET `last_login` = NOW()
WHERE `id` = $this->_accountId LIMIT 1");
}
}
这只是一个用于说明问题的快速模型。 last_activity 和 last_login 字段都有更新数据库的方法,但有时需要同时更新两者(如 loginActions 方法所示)。使用多个查询会浪费大量资源并增加延迟。
我现在能想到很多方法来做到这一点。其中一些很糟糕,而另一些则可用。
这是一个列表:
- 手动进行专门查询,不要使用这些方法。
- +不浪费资源。
- -降低可维护性。
- 创建一个类似代理的类,可以告诉它在执行一组查询之前对其进行优化。
- +根据要求创建优化查询。
- +可以在类中使用方法。
- - 必须指定它应该优化哪些传入查询并告诉它之后执行查询。
- - 对应用服务器的性能影响很小。
- - 随着涉及更多外部组件,复杂性增加。
- 使用对象来表示行的当前状态并一次性保存。
- +简单。
- -大量不必要的数据被发送到数据库。
- -浪费资源。
- -如果在获取行后数据发生变化,情况会变得更糟。
- 使用对象表示行的状态,但只保存更改的列。
- ...
在这种情况下,性能、复杂性和可维护性之间的最佳平衡是什么?
【问题讨论】:
标签: php oop optimization mysqli dry