0

我正在编程的网站有问题。在我有页面和子页面的网站部分上,事情有点慢。在本节中,我有很多 mySQL 查询,有 20 多个查询同时执行,这让我最多等待 5 秒,直到出现任何结果。

我读了这个问题每页加载 20 个 SQL 查询真的考虑了很多吗?并发现我确实有问题......并且madlep的回答提到了这种N + 1情况,我在foreach中查询每个页面的数据库,寻找它的孩子。

这是一个例子(顺便说一下,我正在使用 Laravel):

 $pages = Page::where('slug', '=', $slug)->get(array('id', 'title', 'slug'));
 foreach ($pages as $page) {
    $children = Page::where('parent_id', '=', $page->id)->get(array('id', 'title', 'slug'));
    foreach ($children as $child) {
        $grandChildren = Page::where('parent_id', '=', $child->id)->get(array('id', 'title', 'slug'));
    }
 }

作为一个新手,我试图找到一种更好的方法来处理这个问题,减少页面查询。

问题是:如何在 foreach 循环之外获取子页面?一切都是动态完成的,所以我需要一种灵活的方法来处理这个问题。

4

1 回答 1

1

首先,由于您跟踪的项目数量相对较少(例如网页),因此我将从保存整个层次结构的缓存数据结构中提取这些数据结构,并且可以在 RAM 中进行查询,而不是发出数据库查询。您可以在应用程序启动时构建此缓存结构,如果您经常更改页面,则可以通过任务/作业定期重建它。但是,如果这不是一个选项,您确实需要重写整个 SQL 查询,将完整记录集的返回作为单个 SET OPERATION 执行,而不是使用代码逻辑执行多个查询。您的 ORM 可能有办法处理 N+1,但通常它们会告诉您重新编写查询或重组表以避免 N+1。

缓存结构示例 字典形式为:CurrentPageId、ParentPageId

ParentPageId 为空的任何页面都是根级别页面。

于 2013-05-22T19:44:21.007 回答