4

我有一个巨大的 ID 列表,我需要通过一个表查询这些 ID 在表中是否可用,如果是,则获取其模型。

由于有几千个 ID,这个过程真的很慢,因为我正在使用 CActiveRecord::find() 方法

前任。$book = Book::model()->find('book_id=:book_id', array(':book_id'=>$product->book_id));

我什至索引了所有可能的键,仍然没有改进。有什么提高执行速度的建议吗?

提前致谢 :)

4

2 回答 2

4

1)制作书籍ID列表

foreach $product in Product-List
    $book_ids[$product->book_id] = $product->book_id;

现在查询所有 Book 模型(由 索引book_id

$books = Book::model()->findAll(array(
    'index' => 'book_id',
    'condition' => 'book_id IN (' . implode(',', $book_ids). ')',
));

集成$books到您的代码中,我相信您正在遍历所有产品。

foreach $product in Product-List
    if( isset($books[$product->book_id]) )
        $model = $books[$product->book_id]

2)另一种方式(我只是假设你有产品模型)

在 Product 模型中添加与 Book 的关系

public function relations() {
    .......
    'book'=>array(self::HAS_ONE, 'Book', 'book_id'),
    .......
}

在检索您的产品列表'with' => array('book')时,使用 CActiveDataProvider 或 CActiveRecord 中的任何一个添加条件...

//Example
$productList = Product::model()->findAll(array(
    'with' => array('book'),
));

foreach( $productList as $product ) {
    .......
    if( $product->book != null )
        $model = $product->book;
    ......
}

无论哪种方式,您都可以减少 SQL 查询。

于 2012-10-09T05:59:19.190 回答
2

如果您使用模式缓存会更好,因为Yii每次执行查询时都会获取模式。它将提高您的查询性能。

config/main.php您可以通过在文件中进行一些配置来启用模式缓存。

return array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'system.caching.CApcCache', // caching type APC cache
        ),

        'db'=>array(
            ...........
            'schemaCachingDuration'=>3600, // life time of schema caching
        ),
    ),
);

您还可以获取表的特定列,这也将提高性能。

您可以使用CDbCriteriawith find 方法来做到这一点CActiveRecord

$criteria = new CDbCriteria;
$criteria->select = 'book_id';
$criteria->condition = 'book_id=:book_id';
$criteria->params = array(':book_id'=>$product->book_id);
$book = Book::model()->find($criteria);

nosql如果您正在处理数千条记录,如果合适的话,我建议您使用任何数据库。

于 2012-10-09T04:35:18.293 回答