مالیات EAV: چرا بارگذاری محصولات Magento کند است
کاربران Magento اغلب از سرعت شکایت دارند. بسیاری از این کاربران بدون اینکه بدانند، «مالیات EAV» را پرداخت میکنند.
یک محصول در Magento تنها یک ردیف نیست؛ بلکه مجموعهای از ردیفهاست که در جداول مختلف پراکنده شدهاند. یک جدول ستونهای ایستا (static) را نگه میدارد و جداول دیگر انواع دادههای خاص مانند varchar ،int ،decimal ،text و datetime را ذخیره میکنند.
برای بارگذاری یک محصول، Magento از تکتک این جداول داده میخواند و سپس آنها را دوباره به صورت یک شیء (object) به هم میچسباند. اگر یک Store View اضافه کنید، حجم کار دو برابر میشود.
بزرگترین تله، استفاده از addAttributeToSelect('*') است.
علامت ستاره به این معناست که شما تمام ویژگیها (attributes) را بارگذاری میکنید. اگر یک صفحه دستهبندی ۳۶ محصول را نشان دهد، ممکن است تنها به شش فیلد مانند نام و قیمت نیاز داشته باشد. اما اگر از ستاره استفاده کنید، در عوض ۶۰ فیلد را بارگذاری میکنید. Magento ۵۴ فیلد اضافی را میخواند، با هم ترکیب (join) میکند و پردازش میکند، فقط برای اینکه در نهایت آنها را دور بریزد.
شما میتوانید این مشکل را در پنج دقیقه حل کنید.
استفاده از ستاره را متوقف کنید. دقیقاً ستونهایی را که نیاز دارید لیست کنید:
- name
- price
- small_image
- url_key
- status
- visibility
این تغییر، بزرگترین گام برای بهبود صفحات لیستبندی کند است.
برای یک راهکار عمیقتر، محصولات را در صفحات لیستبندی از طریق EAV بازسازی نکنید. صفحات دستهبندی و جستجو باید از جداول ایندکس (index tables) و OpenSearch داده بخوانند. Magento این ایندکسها را برای شما نگهداری میکند. یک صفحه دستهبندی سریع، بر این ایندکسها تکیه میکند و تنها برای تعداد کمی از ویژگیها که قالب (template) نمایش میدهد، به سراغ EAV میرود.
از قابلیت flat catalog استفاده نکنید. Adobe آن را منسوخ (deprecated) کرده است، زیرا وقتی ویژگیهای زیادی دارید، با خطا مواجه میشود. این قابلیت حجم سنگینی از کار ایندکسگذاری را اضافه میکند و به محدودیتهای ستون MySQL برخورد میکند.
برای عملکرد بهتر، این قوانین را دنبال کنید:
- فقط ویژگیهای نامگذاری شده را انتخاب کنید. هرگز در مجموعههایی (collections) که برای کاربران نمایش داده میشوند، از ستاره استفاده نکنید.
- برای لیستبندی و فیلتر کردن از OpenSearch استفاده کنید.
- برای خروجیهای انبوه (bulk exports)، از keyset pagination بر اساس
entity_idاستفاده کنید. - فقط فیلدهایی را که برای خروجی نیاز دارید انتخاب کنید.
نتایج خود را اندازهگیری کنید. لاگ کوئری (query log) خود را فعال کنید. اگر یک صفحه دستهبندی واحد، صدها کوئری اجرا میکند، دلیل آن بازسازی EAV است. اکنون میدانید چگونه خط کدی که باعث ایجاد مشکل شده است را پیدا کنید.
Source: https://dev.to/iamrobindhiman/the-eav-tax-why-magento-product-loads-are-slow-117h
