Fastest way to check if products exist
The fastes way for a single call is to use getIdBySku
from catalog/product
:
if (Mage::getSingleton('catalog/product')->getIdBySku('yoursku')) {
// Product exists
} else {
// Product does not exist
}
Mind the getSingleton
instead of getModel
for this usage!
Alternative:
If you need to read them all in once you can use getAllIds()
from a collection.
The best call would be
getAllIds()
in my knowledge.
Explanation
$collection = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('sku')
->addAttributeToSelect("$supplier_name")
->addAttributeToSelect('production_nr')
->addAttributeToSelect('sku_supplier')
->addAttributeToFilter($supplier_name,array('eq' => $suppliers_product_nr));
This one won't take any time since it is just preparation of a collection query. This query will be actually run only when the collection is loaded through load()
call or through foreach()
loop or through count()
call etc.
Here you can check the collection count status in many ways. I am listing out them in their best performance basis (performance decreases while go down).
$collection->getAllIds()
- Best Option$collection->getSize()
count($collection)
$collection->count()
- Least option
Why This Order ?
count()
defines in Varien_Data_Collection
and it loads the collection first and then take the count by counting collection items. Since it involves collection load, it will take highest time.
count($collection)
do not have much difference with above one.
getSize()
defines in Varien_Data_Collection_Db
and it avoids collection load. This is the big advantage over here. This will give you a good performance when use it for checking. See answer from Marius for more details.
getAllIds()
is the best choice. This method is available in Mage_Eav_Model_Entity_Collection_Abstract
and it has a very subtle difference with getSize()
in definition and which makes this best choice.
getAllIds()
internally calls getAllIdsSql()
and see the definition here:
public function getAllIdsSql()
{
$idsSelect = clone $this->getSelect();
$idsSelect->reset(Zend_Db_Select::ORDER);
$idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
$idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
$idsSelect->reset(Zend_Db_Select::COLUMNS);
$idsSelect->reset(Zend_Db_Select::GROUP);
$idsSelect->columns('e.'.$this->getEntity()->getIdFieldName());
return $idsSelect;
}
Here $idsSelect->columns('e.'.$this->getEntity()->getIdFieldName());
is what make this method finest in the all available methods. In fact, this line is absent in getSize()
.