Magentoのパフォヌマンスの向䞊

...たたはコレクションの適切な動䜜。

パフォヌマンスの問題があったほずんどすべおのMagentoプロゞェクトで芋た゚ラヌに぀いおお話したいず思いたす。 Magentoを䜿甚する堎合、他人のコヌドを監査する必芁がある堎合がありたす。 したがっお、あなたのサむトのパフォヌマンスを改善し、将来の間違いを避けるのに圹立぀経隓をあなたず共有したいず思いたす。

この蚘事では、Magento 1に぀いお説明しおいたす。*ただし、説明されおいるこずはMagento 2にも圓おはたりたす。

パフォヌマンスの問題があるほずんどすべおのプロゞェクトで、次のようなものを芋぀けるこずができたす。

$temp = array(); $collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*'); foreach ($collection as $product) { $product = $product->load($product->getId()); $temp[] = $product->getSku(); } 
間違った

の代わりに

 $temp = array(); $collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('sku'); foreach ($collection as $product) { $temp[] = $product->getSku(); } 
そうだね

この理由は非垞に簡単です。

  1. ロヌド埌、必芁な属性はありたせん
  2. むンタヌネットの「プログラマヌ」もそうです
  3. 「悪化しない」ずいう原則に埓っお、䜙分な属性をロヌドする

䜕が間違っおいるのか、パフォヌマンスで䜕ができるのかを理解するには、コレクションの操䜜に集䞭するこずをお勧めしたす。

  1. Eav /フラットテヌブル
  2. キャッシュ
  3. コレクションの適切な䜜業

そしおもちろん結論。



EAV /フラットテヌブル


EAVは、属性が属する゚ンティティ、属性自䜓、およびその倀が異なるテヌブルに配眮されおいる堎合のデヌタストレヌゞアプロヌチです。

MagentoのEAV゚ンティティには、補品、カテゎリ、カスタムメヌタヌ、䜏所のカスタムアドレスが含たれたす。 属性自䜓はeav_attributeテヌブルに保存されたす。

Magento 5の合蚈属性倀タむプは、text、varchar、int、decimal、およびdatetimeです。 もう1぀のタむプがありたす。静的です。゚ンティティを含むテヌブルにあるずいう点で他の5぀のタむプず異なりたす。

属性テヌブルは、このテヌブルたたはその属性がどのテヌブルたたはどのタむプであるかを瀺し、Magentoはすでにどこに曞き蟌むか、どこから読み取るかを知っおいたす。

このような倀の栌玍により、セットの属性を非垞に簡単に実装できたす各゚ンティティが独自の属性を持぀こずができる堎合、たたはたったく持たない堎合。新しい属性の远加はデヌタベヌス内のもう1行です。 別のストアの1぀の属性に新しい倀を远加したした-この属性の倀の衚の新しい行。

デヌタベヌスに保存される方法
゚ンティティ
補品-catalog_product_entity、
カテゎリ-catalog_category_entity、
顧客-customer_entity、
顧客の䜏所-customer_address_entity

属性
eav_attribute
catalog_eav_attribute
customer_eav_attribute

倀
* _text
* _varchar
* _int
* _decimal
* _datetime

フラットは、すべおが1か所にあり、䞍必芁な䜜業なしで補品ずそのすべおの属性を取埗するために远加のテヌブルを必芁ずしない、私たち党員に銎染みのあるアプロヌチです-SELECT * FROM plate WHERE id = some kind of id and that's。

EAV゚ンティティから、フラット衚瀺はカテゎリず商品にのみ䜿甚できたす。

デヌタベヌスに保存される方法
補品
catalog_product_flat_1 // * _N store_view
カテゎリヌ
catalog_category_flat_1 // * _N store_view

フラットテヌブルに属性を含め、䞀般にフラットテヌブルの䜿甚を有効にするには、次の手順を実行したす。
管理パネルの[カタログ]> [属性]> [属性の管理]

属性に次の倀のいずれかがある堎合、Magentoは属性をフラットテヌブルに远加したす。



管理パネルの[システム]> [構成]> [カタログ]

Magentoは、以䞋にリストされおいる゚ンティティに察しおフラットテヌブルを䜿甚したす。



次の事実に泚意しおください。

  1. フラットテヌブルは、カテゎリペヌゞ、グルヌプ補品の補品リスト、および実際にコレクションが䜿甚されおいる堎所でのみ䜿甚されたす。 モデルでloadメ゜ッドを䜿甚する堎合、管理パネルの補品ペヌゞでは䜿甚されたせん。
  2. フラットテヌブルを有効にした埌、むンデックスを再䜜成する必芁がありたす。そうしないず、Magentoは匕き続きEAVテヌブルのみを䜿甚したす
  3. フラットテヌブルを有効にした埌、Magentoは匕き続きEAVを䜿甚したすが、倉曎を保存するずきにフラットテヌブルぞの倉曎のコピヌを開始したす

なぜこれがすべお必芁なのか、なぜフラットアプロヌチをどこでも䜿甚しないのか 長所ず短所のピボットテヌブルを芋おください
EAV
+ Flatよりも柔軟なシステム
+新しい属性を远加するずきにデヌタのむンデックスを再䜜成する必芁はありたせん
+ほが無制限の数の属性
+すべおの属性は垞に利甚可胜です。
+明瀺的に指定されおいなくおも、静的属性sku、created_at、updated_atは垞に遞択範囲に存圚したす
-臎呜的゚ラヌ存圚しない属性の取埗/フィルタリング時にメンバヌ関数getBackendを呌び出す
-パフォヌマンス

フラット
+パフォヌマンス
+フラットテヌブルに远加された既存の属性のみを遞択/フィルタリングに適甚できたす
-行サむズ最倧65,535バむト、぀たり85 varchar 255および列数InnoDBは最倧1000、䞀郚は最倧4096の制限
-コレクションを䜿甚する堎合にのみ䜿甚されたすロヌド時には垞にEAVが䜿甚されたす
-結果は、EAVを䜿甚したリク゚ストの発行ずは異なりたす静的属性なし
-むンクルヌドの再むンデックスが必芁な堎合、そうでない堎合はEAVテヌブルが䜿甚されたす
-新しい属性を远加する堎合、フラットテヌブルのむンデックスを再䜜成する必芁がありたす



キャッシュ


もちろん、デヌタベヌス内のク゚リを高速化する方法ず、キャッシュが私たちを保存し、すべおがキャッシュされおいる堎合、䞀般にコレクションがどのように動䜜するかを理解する必芁があるのはあなたそれぞれです。 簡単に答えたす-キャッシュはあなたを救いたせん。 Magentoに衚瀺されるキャッシュは、コレクションを自動的にキャッシュしたり、デヌタのむンポヌト時や䜕かのカりント時などに䜿甚するカスタムコントロヌラヌやモデルで動䜜したせん。 さらに、キャッシュに入れる前に、なんらかの方法でキャッシュに入れおすぐにナヌザヌに衚瀺する必芁があるためです。

Magento 1のキャッシュの皮類。*




...そしおコレクションを自動的にキャッシュするものはありたせん。


コレクションの適切な䜜業


倚くの人が以前ずは異なる方法で䜕かを行う必芁がある理由をより明確に瀺すために、さたざたなアプロヌチのパフォヌマンステストを行うこずにしたした。 テストベンチから始めたしょう。 テストには、次のものを䜿甚したした。

テストスタンド
OS X 10.10
3.1 GHz Intel Core i54コア
8GB

Magentoの構成
Magento EE 1.14.0
MySQL 5.5.38
PHP 5.6.2

内容
3぀のカテゎリヌ
2000補品
2000 CMSペヌゞ

プロセス
テストでは、1぀のコントロヌラヌず1぀のアクションで拡匵機胜が䜜成され、各テストが5回実行された埌、平均時間が蚈算されたした。 すべおの結果は秒単䜍です。

 class Test_Test_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { $temp = array(); $start = microtime(true); Init values Loop start $temp[] = $product->getSku(); Loop end Or Some code snippet $stop = microtime(true); echo $stop - $start; } } 

擬䌌コヌド

テスト


  1. モデルをリロヌドする堎合ずしない堎合のEAV /フラット
  2. コレクションのキャッシュ
  3. countおよびgetSizeの適切な䜿甚
  4. getFirstItemおよびsetPage1,1の適切な䜿甚

モデルをリロヌドする堎合ずしない堎合のEAV /フラット


収集サむクル。 ルヌプ内にロヌドリブヌトモデルがある堎合

 $temp = array(); $collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect(...); foreach ($collection as $product) { $product = $product->load($product->getId()); $temp[] = $product->getSku(); } 

収集サむクル。 内郚に負荷モデルがない堎合

 $temp = array(); $collection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect(...); foreach ($collection as $product) { $temp[] = $product->getSku(); } 

3皮類のデヌタサンプリング

  1. addAttributeToSelect '*'; //すべおの属性
  2. addAttributeToSelect 'sku'; // 1぀の静的属性
  3. addAttributeToSelect 'name'; // 1぀の暙準属性

結果


お気づきかもしれたせんが、モデルをリロヌドしない堎合の時間は、モデルをリロヌドする堎合よりも短い時間です。 たた、フラットテヌブルが有効になっおいる堎合぀たり、䜙分な結合や結合がない堎合には時間がさらに短くなり、必芁な属性のみを遞択したす。

最初のケヌスでは、倚くの結合で起動したす...そしお、それを再床行いたすが、モデルの堎合は2000回です。

2回目は、属性静的補品自䜓ず同じラベルにありたすに察しおこれを行い、Magentoは結合を行う必芁がありたせん。 したがっお、時間が短くなりたす。

3床目に、Magentoはこの属性が保存されおいる別のプレヌトをアタッチする必芁がありたす。

フラットテヌブルではすべおが䌌おいたすが、2぀の堎合はすべお同じです。これは、䞡方の属性が1぀のテヌブルにあるため、時間が同じであるためです。

数字はそれを物語っおいるず思いたす。


コレクションのキャッシュ


キャッシュなし

 $collection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('*'); 

initCacheメ゜ッドの䜿甚

 $collection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('*') ->initCache(Mage::app()->getCache(),'our_data',array('SOME_TAGS')); 

カスタムキャッシュの実装

 $cache = Mage::app()->getCache(); $collection = $cache->load('our_data'); if(!collection) { $collection = Mage::getModel('collection/product')->getCollection()->addAttributeToSelect('*')->getItems(); $cache->save(serialize($collection),'our_data',array(Mage_Core_Model_Resource_Db_Collection_Abstract::CACHE_TAG)); } else { $collection = unserialize($collection); } 

キャッシュを䜿甚せずに、Magentoが提䟛する方法を䜿甚し、キャッシュモデルの方法に基づいお、どこにも芋たこずがない束葉杖を䜿甚したサンプルを考えおみたしょう。 すべおのテストで、リク゚ストをコンパむルした埌、デヌタをロヌドし、コレクションをオブゞェクトの配列に倉換したこずに泚意しおください。

結果


キャッシュがなければ、実際には驚くべきこずは䜕もありたせん...すべおが通垞通りです。

しかし、マれンタのキャッシュを䜿甚しお、時間が長くなったのを芋お驚いた。 EAVコレクションは最初に商品テヌブルから゚ンティティを読み蟌むためこれはたさにキャッシュされおいるものです、それから別のリク゚ストで属性倀を遞択し、オブゞェクトを埋めるため、䞀般的にEAVキャッシングは愚かな仕事です。 そこのフラットでは、1぀のテヌブルのすべおが远跡されたす。 しかし、それでも、デヌタベヌスを䜿甚するよりもキャッシュを䜿甚する方が時間がかかりたすファむルシステムずredisの䞡方でテストしたした-カンマの埌の4桁目が異なりたす...぀たり、2k゚ンティティには存圚したせん。 InitCacheメ゜ッドの本質は、最初にコレクション自䜓のすべおのデヌタペヌゞネヌション、フィルタヌ、むベントなどを収集し、sql芁求からハッシュを䜜成しおキャッシュ内で怜玢し、そこに䜕かがある堎合、 anserlsizes、すべおのむベントず埌続のメ゜ッドが起動されたす。 これはプロセス党䜓で最も遅い手順です。デヌタベヌス内の単玔なク゚リよりもキャッシュが遅いのはここです。 しかし、その埌、デヌタベヌスにリク゚ストを送信したせん...すでにそれほど怖くはありたせん。

私がひざの䞊に曞いたキャッシュを䜿甚した別の䟋がありたす。そこで、コレクションの最終結果をキャッシュし、すべおのむベントをバむパスしお属性をロヌドしたす。 これは、EAVおよびフラットコレクションで機胜したす。

countおよびgetSizeの適切な䜿甚


getSize

 $size = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('*') ->getSize(); 

カりント

 $size = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('*') ->count(); 

結果


メ゜ッドの違いは、 countがコレクション内のすべおのオブゞェクトをロヌドし、通垞のphpカりントでオブゞェクトの数をカりントし、数を返すこずです。 getSizeはコレクションをロヌドしたせんが、制限、泚文、遞択可胜な属性のリストがなく、COUNT*のみが存圚するデヌタベヌスぞの芁求をさらに1぀生成したす。

䞡方の方法の䜿甚䟋は次のずおりです。

デヌタベヌスに倀があるかどうか、たたはその数を知る必芁がある堎合は、getSizeを䜿甚したす。コレクションをロヌドする必芁がある堎合、たたは既にロヌドされおいる堎合はcountを䜿甚したす。コレクションにロヌドされた芁玠の数を返したす。

getFirstItemおよびsetPage1,1の適切な䜿甚


getFirstItem

 $product = Mage::getModel('catalog/product')->getCollection() ->getFirstItem(); 

setPage1,1

 $product = Mage::getModel('catalog/product')->getCollection() ->setPage(1,1) ->getFirstItem(); 

負荷

 $product = Mage::getModel('catalog/product')->load(22); 

結果


getFirstItemの問題は、コレクション党䜓をロヌドしおから、foreachの最初の芁玠を返すだけで、そうでない堎合は空のオブゞェクトを返すこずです。

setPage別名$ this-> setCurPage$ pageNum-> setPageSize$ pageSizeは、遞択範囲を厳密に1レコヌドに制限したす。これにより、結果のロヌドが倧幅に高速化されたす。

読み蟌みでもgetFirstItemより高速ですが、1぀の芁玠のコレクションから取埗するよりも読み蟌みが遅くなるこずに泚意しおください。 これは、ロヌドが垞にEAVテヌブルで機胜するためです。



結論


䞊蚘のすべおを芁玄するために、Magentoで䜜業するすべおの人にアドバむスしたいず思いたす。

Source: https://habr.com/ru/post/J282025/


All Articles