10

我们的应用程序目前的工作方式如下:

class myClass{

    private $names = array();

    function getNames($ids = array()){
         $lookup = array();

         foreach($ids as $id)
             if (!isset($this->names[$id]))
                $lookup[] = $id;

         if(!empty($lookup)){
              $result;//query database for names where id in $lookup
                      // now contains associative array of id => name pairs
              $this->names = array_merge($this->names, $result);
         }

         $result = array();
         foreach($ids as $id)
             $result[$id] = $this->names[$id];

         return $result;
    }
}

效果很好,除了它仍然可以(并且经常这样做)导致多个查询(在这种情况下为 400+)。

因此,我正在考虑简单地查询数据库并使用数据库中的$this->names每个名称填充数组。

但是我担心在执行此操作时我应该开始担心数据库中有多少条目?(数据库列是 varchar(100))

4

2 回答 2

7

你有多少内存?在高峰访问期间,您的服务通常支持多少并发用户?这些是相关的信息。没有他们,任何答案都是无用的。一般来说,这是一个很容易通过负载测试解决的问题。然后,找到瓶颈并优化。在那之前,让它工作(在合理的范围内)。

但 ...

如果你真的想知道你在看什么......

如果我们假设您不存储多字节字符,那么您有 400 个名称 * 100 个字符(假设每个名称都达到了您的字符限制)......您正在查看约 40Kb 的内存。看起来太微不足道了,不是吗?

显然,您将从 PHP 中获得其他开销来保存数据结构本身。您可以使用数据结构SplFixedArray而不是 plain更有效地存储东西array吗?可能——但是你会失去高度优化的array_*功能,否则你必须操纵列表。

用户会使用您计划在内存中缓冲的每一个条目吗?如果您的应用程序必须使用它们,那么它们有多大并不重要,不是吗?将大量不需要的信息“仅仅因为”保留在内存中并不是一个好主意。您绝对不想做的一件事是在每次页面加载时查询数据库以获取 4000 条记录。至少您需要将这些类型的事务放入内存存储中,如 memcached 或使用 APC。

这个问题——就像计算机科学中的大多数问题一样——只是一个受约束的最大化问题。除非您知道可以使用的变量,否则无法正确解决它。

于 2012-08-29T04:29:53.320 回答
3

一旦您获得超过一千项左右的键控查找开始变得非常缓慢(当您访问特定键时会有延迟)。你可以用 ksort() 来解决这个问题。(我看到一个脚本从 15 分钟的运行时间缩短到 2 分钟以下,只需添加一个 ksort)

除此之外,您实际上仅受内存限制。

更好的方法是在脚本中构建一组丢失的数据,然后使用 IN 列表在一个查询中获取它们。

如果您可以提供帮助,您真的不应该浪费内存来存储用户永远不会看到的数据。

于 2012-08-29T04:30:12.010 回答