【问题标题】:Fastest way to count number of rows in MySQL database in Laravel?在 Laravel 中计算 MySQL 数据库中行数的最快方法?
【发布时间】:2013-12-04 00:33:19
【问题描述】:

我可以想到几种使用 Laravel(第 3 版)计算表中行数的方法。

DB::table('threads')->count();
Threads::count();
Threads::max('id');
DB::table('threads')->max('id);
DB::query('SELECT COUNT(*) FROM threads;');

其中任何一个明显比其他更快吗?有没有一种最快的方法来运行这个查询?稍后它将成为表达式的一部分:ceil(DB::table('threads')->count() / $threads_per_page);,它会在每次页面加载时执行,因此最好进行优化。

数据库/表是 MySQL 和 InnoDB 引擎。

【问题讨论】:

    标签: php mysql performance count laravel


    【解决方案1】:

    MAX(ID) 与计算行数不同,因此排除了五种选择中的两种。

    然后你的任务就是对其余三种方法进行性能比较以获取计数。我认为直接执行 SQL 语句可能会消除大量不必要的 ORM 层开销并且实际上更快,但除非事实证明,否则这将是过早的优化。

    【讨论】:

    • MAX(id) 的好点,你是对的。现在我只使用Threads::count(),但这似乎是很多 ORM 膨胀。我想我得测试一下。
    • MAX(id) 显示您的表中最大的 id。所以如果你删除行,你的表中的条目数将不会与最大的id相同。
    【解决方案2】:
    DB::table('threads')->count();
    Threads::count();
    DB::query('SELECT COUNT(*) FROM threads;');
    

    我也在寻找同样的东西。 这 3 个结果与我测试的查询完全相同(您可以使用 laravel 调试栏观看)。 Laravel 执行“SELECT COUNT(*) as aggregate FROM threads”; 它已经用 eloquent 进行了优化,但是如果你这样做了 ->get()->count() 它就没有优化! 与 Threads::count() 没有性能差异;

    Max('id') 完全不同,因为它输出最大id,它永远不会计算行数。

    【讨论】:

      【解决方案3】:

      我认为这并不重要.. 只是在您的代码中保持一致.. 任何方式都不需要在每次页面加载时运行该查询。使用一些缓存来缓存该数字。

      【讨论】:

      • # 变化相当频繁,因此您基本上必须在每次页面加载时计算它。
      猜你喜欢
      • 2011-10-19
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2012-11-27
      • 1970-01-01
      • 2012-10-01
      相关资源
      最近更新 更多