Joomla getItems 默认分页
Posted
技术标签:
【中文标题】Joomla getItems 默认分页【英文标题】:Joomla getItems default Pagination 【发布时间】:2013-07-03 12:53:58 【问题描述】:谁能告诉我模型中的getItems()
函数是否在执行查询之前自动添加全局设置的LIMIT(来自getListQuery()
)。 Joomla 真的很挣扎,似乎试图缓存整个结果(这里有超过 100 万条记录!)。
在查看 /libraries/legacy/model/list.php 和 /libraries/legacy/model/legacy.php 之后,getItems()
似乎确实添加了 LIMIT在将结果发送到缓存之前使用$this->getState('list.limit')
setQuery 但如果是这种情况 - 为什么 Joomla 如此挣扎。
那么发生了什么?为什么phpMyAdmin可以在一秒钟内返回有限的结果而Joomla只是超时?
非常感谢!
【问题讨论】:
【参考方案1】:如果您有 100 万条记录,您肯定会按照 Riccardo 的建议,覆盖和优化模型。
JModelList 运行查询两次,一次用于分页编号,然后用于显示查询本身。您需要小心地从 JModellist 继承以避免分页查询。
另外,articles query 因其连接而臭名昭著。您肯定会失去一些减速(例如,怀疑您正在使用联系人链接)。
如果所有文章都对公众可见,您可以remove the ACL check - 这相当昂贵。
也没有来自西方或东方的 DBA 能够解释为什么需要所有这些 GROUP BY's。
失去这些东西会有很大帮助。事实上,从头开始构建查询可能是最好的。
【讨论】:
嗨,谢谢 - 我刚刚放弃了 JPagination,它的加载速度要快得多!问题是 - 我想保留 JPagination 但更改 getTotal 函数,以便不是从完整查询中计算行数,而是让数据库执行“选择计数”。谁能推荐如何在不破解核心 Joomla 代码的情况下做到这一点?【参考方案2】:它会自动添加分页。
它的挣扎很可能是由于一个大数据集(即集合中返回的 1000 多个项目)和许多查找字段:例如内容模块连接多达 10 个表,以获取作者姓名等。
这可能是一个真正的杀手,我在专用服务器上运行了超过一秒钟的查询,并且只有 3000 个内容项。我们发现的一个标签云组件可能需要长达 45 秒才能返回关键字列表。如果是这种情况(很多记录和很多join),你唯一的出路就是进一步限制options中的filters,看看能不能得到一些更快的结果(比如限制最近3个月的文章可以大大减少所需的时间)。
但是,如果这还不够或不可行,您将不得不在新模型中编写新的优化查询,这最终将带来任何其他优化的最佳性能优化。在编写查询时,请考虑利用数据库特定的优化,即添加索引、全文索引,并且仅在确实需要时才使用连接。
还要考虑连接决不能随着字段、翻译或其他的数量而增长。 常量查询很容易被数据库引擎优化和缓存,而动态查询永远不会那么高效。
【讨论】:
以上是关于Joomla getItems 默认分页的主要内容,如果未能解决你的问题,请参考以下文章