我决定查看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个查询,会员约有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
吗?
答案 0 :(得分:3)
首先,当您以成员身份登录时,将执行这些成员查询。如果您未登录,则不会执行这些查询,因此可以为您保存10个查询。
您的第二个问题,每个新添加的过滤器,只会返回一个新的DataList,而不是实际执行最终查询,直到您回显它们。虽然你的例子不起作用,因为$ 2是DataList,而不是DataObject。要获得实际项目,您需要执行$two->HasOneObject()->Field
,但不要这样做。
要降低这些查询,您可以考虑缓存。但说实话,我不应该过多担心它。数据库适用于此类事物。如果您实际上将它们作为PHP中的对象加载,那么问题就会变得更糟,因为它会开始吃掉内存。
另一种选择是扩展页面,并将某些查询的结果缓存到变量ArrayList对象中,这样就可以从内存中过滤它们。从理论上讲,这样做速度更快,但需要PHP做更多工作,这可能会在事情发生时变慢。