ФорумРазработкаБазы данных → Оптимизация запросов

Оптимизация запросов

  • developer

    Сообщения: 244 Репутация: N Группа: Кто попало

    Spritz 15 февраля 2019 г. 12:24

    Всем доброго времени суток.
    Есть запрос:

    $SECTION_SQL=$dbTecDoc->query('SELECT DISTINCT 
                    ART_ID, ART_ARTICLE_NR, SUP_BRAND, DES_TEXTS.TEX_TEXT AS STR_DES_TEXT, DES_TEXTS2.TEX_TEXT AS ART_COMPLETE_DES_TEXT  
                FROM LINK_GA_STR
                    INNER JOIN LINK_LA_TYP ON LAT_TYP_ID IN ('.implode(',',$TYP_ID_array).') AND 
                    LAT_GA_ID = LGS_GA_ID 
                    INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID 
                    INNER JOIN SEARCH_TREE ON STR_ID = LGS_STR_ID 
                    INNER JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = STR_DES_ID AND DESIGNATIONS.DES_LNG_ID = '.$LNG_ID.' 
                    INNER JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID 
                    INNER JOIN ARTICLES ON ART_ID = LA_ART_ID 
                    INNER JOIN SUPPLIERS ON SUP_ID = ART_SUP_ID 
                    INNER JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = ART_COMPLETE_DES_ID 
                    INNER JOIN DES_TEXTS AS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID AND DESIGNATIONS2.DES_LNG_ID = '.$LNG_ID.' 
                WHERE 
                    LGS_STR_ID = '.$SECTION_ID.'
                ORDER BY
                    LA_ART_ID
                LIMIT '.$LIMIT);

    Который вытаскивает из базы все ART_ARTICLE_NR для $TYP_ID_array из категории SECTION_ID, артикулов очень много для родительской категории, порядка 2000. Дальше формируется массив который идет по базе с запчастями, в которой больше миллиона записей и все так же вытаскивает совпадения и третий запрос это

    function GetPropertys($ART_ID, $LNG_ID){
                global $dbTecDoc;
                $model_par = '';
                $param_SQL=$dbTecDoc->query("SELECT DES_TEXTS.TEX_TEXT AS CRITERIA_DES_TEXT,
                    IFNULL(DES_TEXTS2.TEX_TEXT, ACR_VALUE) AS CRITERIA_VALUE_TEXT
                FROM ARTICLE_CRITERIA
                    LEFT JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = ACR_KV_DES_ID
                    LEFT JOIN DES_TEXTS AS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID
                    LEFT JOIN CRITERIA ON CRI_ID = ACR_CRI_ID
                    LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = CRI_DES_ID
                    LEFT JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID
                WHERE ACR_ART_ID = ".$ART_ID." AND
                    (DESIGNATIONS.DES_LNG_ID IS NULL OR DESIGNATIONS.DES_LNG_ID = ".$LNG_ID.") AND
                    (DESIGNATIONS2.DES_LNG_ID IS NULL OR DESIGNATIONS2.DES_LNG_ID = ".$LNG_ID.");");
                while ( $model_param = $dbTecDoc->get_row($param_SQL) ) {
                    //$model_par .= $model_param['CRITERIA_DES_TEXT'] . ': ' . $model_param['CRITERIA_VALUE_TEXT'] . ';<br />';
                    $model_par .= '<tr><td>' . $model_param['CRITERIA_DES_TEXT'] . '</td><td>' . $model_param['CRITERIA_VALUE_TEXT'] . '</td></tr>';
                }           
    
        return '<table class="table table-striped table-hover"><tbody>' . $model_par . '</tbody></table>';
    }

    который уже вытаскивает параметры для товара.
    Первый запрос из базы TecDoc отрабатывает около 7-15 секунд, второй не меньше и третий уже в сравнении с остальными гораздо меньше, но все равно эти цифры приводят в ужас. Учитывая что перед ними ещё есть запрос который формирует TYP_ID_array.
    Собственно нужна помощь в оптимизации работы всех этих запросов. Скорее всего я изначально не правильно подхожу к структуре и однозначно говнокодю, потому что я знаю у кого это реализовано и работает это быстро у них.
    Готов отблагодарить финансово за консультации.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!