Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Оптимизация БД


Recommended Posts

Хэллоу. Спешу поделиться небольшим солюшеном, который научит ваш opencart кэшировать запросы, а не каждый раз по-новой обращаться к базе.

Заодно, если найдутся знающие люди, буду рад, если раскритикуют и предложал лучше.

Код не мой, нашел на гитхабе после инцидента с превышением квоты процессорной работы у хостера. Человек использует в продакшене.

Собственно, запросив лог медленных запросов за 4 часа у хостера, обнаружил узкое горлышко:

Цитата

# Profile
# Rank Query ID           Response time  Calls R/Call V/M   Item
# ==== ================== ============== ===== ====== ===== ==============
#    1 0x2B7932AFEE815737 118.9284 76.5%  1087 0.1094  0.07 SELECT oc_category_path oc_product_to_category oc_product oc_product_description oc_product_to_store
#    2 0xCAC7941701616847   9.4839  6.1%    94 0.1009  0.00 SELECT oc_seo_url
#    3 0xDE667724A1472B8E   7.9299  5.1%    51 0.1555  0.28 SELECT oc_review oc_product_discount oc_product_special oc_product oc_product_description oc_product_to_store
#    4 0xC147C0DB8F6F746A   3.5260  2.3%    35 0.1007  0.00 SELECT oc_product_discount oc_product_special oc_product_reward oc_stock_status oc_weight_class_description oc_length_class_description oc_review oc_product oc_product_description oc_product_to_store oc_manufacturer
#    5 0xB1D3084A5DB560C3   1.6027  1.0%     7 0.2290  0.43 SELECT oc_product oc_product_description
#    6 0xF75E926F33E20E3D   1.3082  0.8%    13 0.1006  0.00 SELECT oc_product_attribute oc_attribute oc_attribute_description
#    7 0x270EA830AC8D7EE7   1.1103  0.7%    11 0.1009  0.00 SELECT oc_category oc_category_description oc_category_to_store
#    8 0x2AD6CC66AE9FE12C   1.0053  0.6%    10 0.1005  0.00 SELECT oc_review oc_product_discount oc_product_special oc_product_to_category oc_product oc_product_description oc_product_to_store
#    9 0x27E53545A394E066   0.9096  0.6%     9 0.1011  0.00 SELECT oc_theme
#   10 0x51A9CCA928B1D4F1   0.9079  0.6%     9 0.1009  0.00 SELECT oc_product_attribute oc_attribute oc_attribute_group oc_attribute_group_description
#   11 0xBEB5454CE18270B7   0.8038  0.5%     8 0.1005  0.00 SELECT oc_setting
#   12 0xC299D08C9A944789   0.7034  0.5%     7 0.1005  0.00 DELETE oc_cart
# MISC 0xMISC               7.3385  4.7%    73 0.1005   0.0 <40 ITEMS>

 

Суть работ:

Цитата

Anyway, here is example of the solution we are currently using...

File: /catalog/model/catalog/product.php
Function: getTotalProducts
At the end of the function replace:


$query = $this->db->query($sql);
return $query->row['total'];

With:


$sql_name = md5($sql);

$final_total = $this->cache->get('product.count.' . $sql_name);
if(!$final_total){
    $query = $this->db->query($sql);
    $final_total = $query->row['total'];
    $this->cache->set('product.count.' . $sql_name, $final_total);
}

return $final_total;

 

Реплейсим исходники и спустя сутки наблюдаем такую картину:

 

Спойлер

image.png.f54367431d208074f682c4b52284ea46.png

Малым количеством телодвижений можно добиться хороших результатов.

Кэш обновляется после изменения в структуре БД. Багов пока не наблюдаю.

В большинстве своем, это поможет тем, у кого в продакшене 1000+ товаров.

Был краток.

Я всё.

 

  • +1 3
Надіслати
Поділитися на інших сайтах


3 минуты назад, AlexDW сказал:

да ладно вам - человек нашел, поделился

а не стал ныть "моя нуб, ничего не знаю, памагите!"

 

все с малого начинают

так правильно человек написал или есть другие варианты? более верные?

Надіслати
Поділитися на інших сайтах


17 минут назад, toporchillo сказал:

[:||||||||||||||||||:]

Очень интересно, продолжай.

25 минут назад, dimetrio1986 сказал:

Добрый день, а можно подробнее описать что нужно сделать? а то не понял ничего

Добрый.

В  /catalog/model/catalog/product.php
Заменить

$query = $this->db->query($sql); 
return $query->row['total'];
На
$sql_name = md5($sql); 
$final_total = $this->cache->get('product.count.' . $sql_name); 
if(!$final_total){ 
$query = $this->db->query($sql); 
$final_total = $query->row['total']; 
$this->cache->set('product.count.' . $sql_name, $final_total); 
} 
return $final_total;

 

  • +1 1
Надіслати
Поділитися на інших сайтах


20 минут назад, SiSya сказал:

Очень интересно, продолжай.

Добрый.

В  /catalog/model/catalog/product.php
Заменить


$query = $this->db->query($sql); 
return $query->row['total'];

На

$sql_name = md5($sql); 
$final_total = $this->cache->get('product.count.' . $sql_name); 
if(!$final_total){ 
$query = $this->db->query($sql); 
$final_total = $query->row['total']; 
$this->cache->set('product.count.' . $sql_name, $final_total); 
} 
return $final_total;

 

спасибо!

Надіслати
Поділитися на інших сайтах


17 минут назад, toporchillo сказал:

1. SQL УЖЕ кэширует запросы, если убрать из них NOW(), и кэширует лучше.

2. 100500 файлов в папке кэша все поставят колом. 


А если вместо папки кеша используется memcached?

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.