Ich habe eine externe Datei mit Produktdetails. Ich durchlaufe diese Datei und muss für jedes Produkt in dieser Datei überprüfen, ob das Produkt bereits in Magento vorhanden ist.
Der Wert, der bewertet werden soll, ob das Produkt bereits vorhanden ist, ist ein Attributname und sein Wert.
Also überprüfe ich dies mit (pro Produkt)
$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));
Diese Auswahl selbst scheint nicht viel Zeit in Anspruch zu nehmen:
echo 'check: ',round(microtime(true) - $time, 2) , "s<br/>\n";
meldet 0,00 s,
Die Überprüfung, ob es sich um eine leere Sammlung handelt (dh das Produkt in meiner Magento-Datenbank vorhanden ist, dauert ca. 0,34 bis 0,40 Sekunden
$collection->getSize()
In Anbetracht dessen, dass ich mehrere hunderttausend Produkte überprüfen muss. Dies wird sich schnell summieren. Sehr schnell. Ich hatte auf etwas gehofft, das zeitlich eher 0,01 oder weniger entspricht.
Daher suche ich nach dem schnellsten Weg, um zu überprüfen, ob ein Produkt vorhanden ist. Ich habe einiges an Freiheit beim Ändern und Implementieren des Codes. Wenn es also eine völlig andere Art gibt, dieses Problem zu lösen, würde ich gerne davon hören.
Aktualisieren:
Ich habe es leicht geändert, damit ich nicht mit Magento prüfe, ob ein Produkt Produkt für Produkt vorhanden ist, sondern stattdessen eine Reihe aller Produkte erhalte, für die das Attribut geprüft werden muss. Ich benutze dieses Array, um zu überprüfen, ob das Attribut, gegen das geprüft werden soll, existiert.
Dies ist viel schneller, aber ich befürchte, dass dies Auswirkungen auf den Overhead (hauptsächlich RAM oder CPU) haben wird, wenn die Menge der zurückgegebenen Produkte zu groß wird (wir haben ungefähr 40.000 Produkte in unserer Magento-Installation).
quelle
Antworten:
Erläuterung
Dies wird keine Zeit in Anspruch nehmen, da es sich lediglich um die Vorbereitung einer Sammlungsabfrage handelt. Diese Abfrage wird tatsächlich nur ausgeführt, wenn die Sammlung per
load()
Aufruf oder überforeach()
Schleife oder übercount()
Aufruf usw. geladen wird .Hier können Sie den Status der Sammlungsanzahl auf verschiedene Arten überprüfen. Ich liste sie in ihrer besten Leistungsbasis auf (die Leistung nimmt ab, während sie sinkt).
$collection->getAllIds()
- Beste Option$collection->getSize()
count($collection)
$collection->count()
- Geringste OptionWarum diese Bestellung?
count()
definiert inVarien_Data_Collection
und lädt zuerst die Sammlung und nimmt dann die Zählung durch Zählen der Sammlungselemente. Da die Sammlung geladen wird, dauert es am höchsten.count($collection)
habe keinen großen Unterschied zu oben.getSize()
definiert inVarien_Data_Collection_Db
und vermeidet das Laden von Sammlungen. Dies ist der große Vorteil hier. Dies gibt Ihnen eine gute Leistung, wenn Sie es zur Überprüfung verwenden. Siehe Antwort von Marius für weitere Details.getAllIds()
ist die beste Wahl. Diese Methode ist in verfügbarMage_Eav_Model_Entity_Collection_Abstract
und hat einen sehr subtilen Unterschied zurgetSize()
Definition, wodurch diese beste Wahl getroffen wird.getAllIds()
ruft intern aufgetAllIdsSql()
und sieht die Definition hier:Hier
$idsSelect->columns('e.'.$this->getEntity()->getIdFieldName());
ist, was diese Methode unter allen verfügbaren Methoden am besten macht. In der Tat fehlt diese Zeile ingetSize()
.quelle
Der schnellste Weg für einen einzigen Anruf , ist die Verwendung
getIdBySku
voncatalog/product
:Beachten Sie die
getSingleton
stattgetModel
für diese Verwendung!Alternative:
Wenn Sie sie alle einmal einlesen müssen, können Sie sie
getAllIds()
aus einer Sammlung verwenden.quelle
Wie unten von Rajeev K Tomy erwähnt, scheint die Geschwindigkeit der Abfrage mit der Methode getAllIds () in Magento am schnellsten zu sein. Sie können jedoch auch die erforderlichen Attributwerte (z. B. 'Production_nr' oder 'sku_supplier') abrufen, ohne die Sammlung zu laden. Diese Methode ist etwas langsamer als getAllIds ().
PS Fügen Sie der Sammlung nicht addAttributeToSelect ('name') hinzu, wenn Sie das Attribut 'name' für die Filtermethode verwenden.
PS2 Siehe meine Frage / Antwort über schnellste bekommen rohe Produktdaten ohne Lade Sammlung hier
quelle