我在查询中使用Laravel内置的paginate方法,我需要使用Fulltext搜索大型数据集(大约100K行,每行包含大量文本)。
一切正常,除了我不理解laravel如何计算结果的逻辑:为什么必须执行相同的查询两次(select count()作为聚合)以检索结果的总数,而不是使用php函数count(),在这种情况下效果很好。 因为使用这种方法,我可以在搜索时间的一半,有时可能需要10秒!!
真的有必要使用2个查询,或者有可能以某种方式覆盖这个逻辑? 或者也许是我,我错过了这个逻辑背后的东西?
答案 0 :(得分:0)
查询执行两次,一次获取最终查询返回的记录总数,第二次返回所需数据集。
因此,如果您有一个包含100,000条记录的表,则第一个查询将计算SQL查询返回的记录,假设8,900条记录符合您的要求,它将返回8,900的整数。
然后第二个查询使用您想要的页码,将其乘以每页的计数,然后从该页面返回相关的15个左右的记录,这是SQL查询中的LIMIT和OFFSET值。
值得注意的是,GROUP BY分页结果的处理方式不同。如果将GROUP BY添加到eloquent中任何SQL语句的末尾,它将返回单个SQL查询。此查询获取所有相关数据集,计算返回的行数,然后对数组进行切片以仅返回所需的15个左右记录。
这两种方法之间的区别是第一次返回2个微小的查询响应。首先是总计数,其次是表中的15个左右数据集。
GROUP选项返回符合SQL要求的每条记录的数据集。如果这是总共8,900条记录,那么它将是总共8,900个雄辩的模型对象。
正如您所看到的,如果您的数据库中包含大量记录,那么第二种方法虽然可以更快地执行SQL语句,但会占用更多资源。
如果您的SQL语句花了太长时间执行两次,您可能需要考虑优化表或添加更多INDEX。只是一个想法。