【问题标题】:Yii activerecord and pagination count() slow queryYii activerecord 和 pagination count() 慢查询
【发布时间】:2013-05-17 13:27:16
【问题描述】:

所以基本上问题出在查询SELECT COUNT(*) 中,它在activedataprovider 的calculateTotalItemCount 函数中执行。据我了解,$itemcount 变量需要分页。问题是这个查询对于大表来说很慢。对于我的 ~30m 表,它执行 5 秒。 所以有2种方法可以解决这个问题: 1.禁用分页('pagination'=>'false')并编写自己的分页。 2.重写AR计数功能。

我没有足够的经验/知识来完成这个。 也许有人以前遇到过同样的问题,可以分享他的解决方案。

至少对于totalItemCount,我们可以使用EXPLAIN SELECT *。它的速度更快。

感谢您的帮助。谢谢你。

【问题讨论】:

  • 在你的count查询中有没有条件?

标签: mysql activerecord yii


【解决方案1】:

如果您在原始 SQL 中的查询比活动记录自动创建的查询“便宜”,您也可以手动查询(例如通过 DAO)并在您的数据提供者上设置 totalItemCount

$count = Yii::app()->db->createCommand('SELECT COUNT(*)...')->queryScalar();
$provider = new CActiveDataProvider('SomeModel', array(
    'totalItemCount' => $count,
    'criteria' => $criteria,
    ...

【讨论】:

  • 工作就像一个魅力。谢谢迈克尔,你为我节省了很多时间。 30914676 结果页面现在加载 0.13 秒而不是分页时的 10 秒。
  • 也许你可以解释一下如何在 model->search() 函数的 gridview() 中实现这个更便宜的 count() 版本进行搜索。谢谢。
  • @ineersa 不确定我是否理解:您说它有效,那么您缺少什么?只需在您的 search() 方法中使用上述内容。您需要从搜索属性手动构建count SQL。 “更便宜”的确切含义没有规则:这取决于您的数据库架构。但是您的问题意味着在某些情况下,您可以提供比 Yii 自动创建的 COUNT 执行得更好的 SQL 语句。由您自己决定,何时是这种情况以及如何构建它。
  • 谢谢迈克尔。我只是根据需要重写 search() 方法,现在效果很好。我知道 AR 对大型数据库不利,但也想使用 dataprovider。下次将尝试使用 CSQLDataprovider。无论如何为什么默认使用这么慢的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多