Як не покласти бд mysql, використовуючи пошук по атрибутам в webasyst shopscript, створення і розробка

Як не покласти БД MySQL, використовуючи пошук по атрибутам в WebAsyst ShopScript

Добрий день, шановні читачі мого блогу!

На численні прохання на форумі WebAsyst'a я пишу цей запис. Нічого складного або незвичайного в даній статті немає, але тим не менш, завдяки цьому хаку ви можете уникнути «уложення» вашої БД MySQL.

Отже, приступимо. Відкриваємо файл:
C: \ WebServers \ home \ domain \ www \ published \ SC \ html \ scripts \ core_functions \ product_functions.php

На 507 рядку ми бачимо відкриття циклу, який проганяє все item'и і на 517 ми бачимо що кожен раз в масив $ sqls_joins додається новий LEFT JOIN, який власне і вантажить нашу базу. Для прикладу можу сказати, що при тесті на локальному сервері запит, має 1x LEFT JOIN зайняв 0,002 сек. в той час як 2xLEFT JOIN зайняло 8,8 секунд. (Можлива похибка в даних, бо пишу через тиждень після тесту :), можу сказати одне, що різниця між часом була в 500 разів).

На кожному проході нашого циклу приєднується ОДНА І ТАКОЖ ТАБЛИЦЯ з різним ім'ям, яке просто инкрементируется!

Це відбувається на 519 рядку:

Таким чином, якщо у нас зазначено купа атрибутів при пошуку, то наша база ляже і буде лежати.

Для того щоб уникнути такого казусу, я вніс банальні і можливо, не зовсім гарні, з точки зору правил хорошого тону в програмуванні, зміни.
Необхідно просто прибрати всі згадки про змінну $ cnt і змінити рядки 519 і 543 таким чином, щоб не створювався, а перезаписувати елемент масиву. Таким чином ми приберемо зайві об'єднання таблиць в запиті.

Можливо, найкращим б було рішення виносу цього запису з циклу, але в силу того, що з самого початку не зрозуміло для чого потрібен цей «милиця», я обмежився незначними змінами.

Вдалою оптимізації коду! 🙂