gpt4 book ai didi

mysql - 如何在不循环查询的情况下找到相关页面?

转载 作者:行者123 更新时间:2023-11-29 13:50:52 24 4
gpt4 key购买 nike

我正在编程的网站遇到问题。在我有页面和子页面的网站部分,速度有点慢。我在这一部分有很多 mySQL 查询,有超过 20 个查询同时执行,让我等待最多 5 秒直到出现任何内容。

我读了这个问题Is 20 SQL Queries per page load really considered a lot?并发现我确实有问题...并且 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 循环之外获取子页面?一切都是动态完成的,所以我需要一种灵活的方法来处理这个问题。

最佳答案

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

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

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

关于mysql - 如何在不循环查询的情况下找到相关页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700129/

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