我有一个巨大的 ID 列表,我需要通过一个表查询这些 ID 在表中是否可用,如果是,则获取其模型。
由于有几千个 ID,这个过程真的很慢,因为我正在使用 CActiveRecord::find() 方法
前任。$book = Book::model()->find('book_id=:book_id', array(':book_id'=>$product->book_id));
我什至索引了所有可能的键,仍然没有改进。有什么提高执行速度的建议吗?
提前致谢 :)
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 查询。
如果您使用模式缓存会更好,因为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
),
),
);
您还可以获取表的特定列,这也将提高性能。
您可以使用CDbCriteria
with 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
如果您正在处理数千条记录,如果合适的话,我建议您使用任何数据库。