Як не покласти БД 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 таким чином, щоб не створювався, а перезаписувати елемент масиву. Таким чином ми приберемо зайві об'єднання таблиць в запиті.
Можливо, найкращим б було рішення виносу цього запису з циклу, але в силу того, що з самого початку не зрозуміло для чого потрібен цей «милиця», я обмежився незначними змінами.
Вдалою оптимізації коду! 🙂