gpt4 book ai didi

php - 简单页面的数据库加载

转载 作者:行者123 更新时间:2023-11-29 14:17:50 25 4
gpt4 key购买 nike

我决定查看 SilverStripe 的数据库使用情况,因为我正在构建一个相当大的网站并希望确保它可以适当扩展。

目前我有一个非常简单的页面,但可以理解有许多查询来构建它。我打开了数据库日志以查看请求的内容。

我认为可能有问题的查询(我做的那些)并不常见,但数据库有大约 50 个与此类似的查询:

SELECT conname,pg_catalog.pg_get_constraintdef(r.oid, true)
FROM pg_catalog.pg_constraint r WHERE r.contype = 'c' AND conname = $1 ORDER BY 1;

SiteTree 大约有 10 个查询,Member 大约有 10 个左右。现在这不是问题,但如果每个页面加载大约 100 个查询(除此之外还有其他查询),我将在启动时遇到一些问题。

是什么导致了所有这些查询?我能做些什么来降低它们吗,尤其是上面那个。

此外,如果我这样做:

$data = DataObject::get()->filter('field1' => 'value1');
if ($data->exists()) {
$one = $data->filter('field2' => 'value2');
// do something
$two = $data->filter('field2' => 'value3')->First();
echo $two->Has_One_Field()->Field //accessing a has_one relationship
//do something
}

这会产生 4 个查询还是只有一个和另外两个过滤器只搜索已经生成的 DataList

最佳答案

首先,当您以成员(member)身份登录时,将执行这些成员(member)查询。如果您未登录,则不会执行这些查询,因此可以节省 10 个查询。

你的第二个问题,每个新添加的过滤器,只会返回一个新的数据列表,而不是实际执行最终查询,直到你回显它们。尽管您的示例不起作用,因为 $two 是 DataList,而不是 DataObject。要获得实际项目,您需要执行 $two->HasOneObject()->Field,但除此之外。

要减少这些查询,您可以考虑缓存。但老实说,我不应该为此担心太多。数据库就是为这类事情而设计的。如果您实际上将它们作为对象加载到 PHP 中,那么问题会更糟,因为它会开始占用内存。

另一种选择是扩展页面,并将某些查询的结果缓存到可变 ArrayList 对象中,这样您就可以从内存中过滤它们。理论上这会更快,但需要 PHP 做更多的工作,当它变大时会减慢速度。

关于php - 简单页面的数据库加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41737181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com