【问题标题】:prevent duplicate database queries / store loaded data in static variable防止重复的数据库查询/将加载的数据存储在静态变量中
【发布时间】:2022-08-02 16:49:58
【问题描述】:

我有一个工单表(xxx.xxx 条目)和一个分类表(大约 1000 个条目的表)和一个简单的类。

class Classification {
 private $id;
 private $name;

 /* getter */
 function __construct($id) {
            $item = GET_FROM_DATABASE($id);
            $this->id = $item[\"id\"];
            $this->name = recursiveDatabaseLookup() /* recursive method to get its parents - For example tree -> branch -> leaf */;
 }
}

如果我加载脚本并加载包括分类在内的 10000 张票,我目前从数据库中获取每张票的分类数据,通常是相同的。

将已加载的数据保存在静态变量中是个好主意吗? 例如像这样:

class Classification {
    private $id;
    private $name;

    /* getter */

    private static $alreadyLoadedItems = [];

    function __construct($id) {
        if(count(self::$alreadyLoadedItems) > 0 && isset(self::$alreadyLoadedItems[$id])) {
            /* get data from static var */
            $this->id = self::$alreadyLoadedItems[$id][\"id\"];
            $this->name = self::$alreadyLoadedItems[$id][\"name\"];
        } else {
            $item = GET_FROM_DATABASE($id);
            $this->id = $item[\"id\"];
            $this->name = recursiveDatabaseLookup() /* recursive method to get its parents - For example tree -> branch -> leaf */;
        }
    }
}

或者,还有更好的方法?分类的例子只有一个,我的项目中有很多类似的类。 (机票类别、客户数据等..)

  • 我对一些数据库项目使用类似的技术,比如货币信息,当很明显相同的信息将被多次请求并且不会改变时。在你的情况下是否合适,我不能说。

标签: php mysqli datamapper


【解决方案1】:

如果你加载 10000 张工单,并一张一张地加载分类,就会有 10000 个查询。

如果您使用静态变量,并且您的 10000 张工单包含 100 个不同的分类,并且逐个加载分类,则将有 100 个查询。

您可以尝试在加载 10000 张票后将所有分类 id 作为唯一数组获取,并仅通过一个查询加载分类,例如 select columns u want from classifications where id in (...)

更好的办法,像Redis那样使用缓存,把所有的分类作为hashtable放到redis中,使用HMGET通过ids获取分类。它会从内存中加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2013-10-19
    • 2011-08-30
    相关资源
    最近更新 更多