[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Лучше один большой запрос или 5 маленьких?
Страницы: 1, 2
Эдик
Здравствуйте. Вот столкнулся с проблемой:
На последнем шаге нужно вывести товар. Но так как база очень обширная (14гб) и 77 таблиц, то id в одной таблице, картинки в другой, описание в 3-ей, цена в 4-ой, критерии товара в 5-ой.
Так вот, существует 2 варианта: написать один большой запрос на получение сразу всех записей, удовлетворяющих входному параметру. Собственно вот он:
SELECT DISTINCT
LA_ART_ID AS id,
ART_ARTICLE_NR AS article,
SUP_BRAND AS supp,
DES_TEXTS.TEX_TEXT AS description,
ACR_ART_ID,
GROUP_CONCAT(DES_TEXTS3.TEX_TEXT SEPARATOR ' ; ') AS krit,
GROUP_CONCAT(IFNULL(DES_TEXTS2.TEX_TEXT, ACR_VALUE) SEPARATOR ' ; ') AS value,
CONCAT(
'images/',
GRA_TAB_NR, '/',
GRA_GRD_ID, '.',
IF(LOWER(DOC_EXTENSION)='jp2', 'jpg', LOWER(DOC_EXTENSION))
)
AS path,
TMT_TEXT AS info

FROM
LINK_GA_STR
INNER JOIN LINK_LA_TYP ON LAT_TYP_ID = @TYP_ID AND
LAT_GA_ID = LGS_GA_ID
INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID
LEFT JOIN ARTICLES ON ART_ID=LA_ART_ID
LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = ART_COMPLETE_DES_ID
LEFT JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID
LEFT JOIN SUPPLIERS ON SUP_ID = ART_SUP_ID
LEFT JOIN ARTICLE_CRITERIA ON ACR_ART_ID = LA_ART_ID
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 AS DESIGNATIONS3 ON DESIGNATIONS3.DES_ID = CRI_DES_ID
LEFT JOIN DES_TEXTS AS DES_TEXTS3 ON DES_TEXTS3.TEX_ID = DESIGNATIONS3.DES_TEX_ID
LEFT JOIN LINK_GRA_ART ON LGA_ART_ID = LA_ART_ID
LEFT JOIN GRAPHICS ON GRA_ID = LGA_GRA_ID
LEFT JOIN DOC_TYPES ON DOC_TYPE = GRA_DOC_TYPE
LEFT JOIN ARTICLE_INFO ON AIN_ART_ID = LA_ART_ID
LEFT JOIN TEXT_MODULES ON TMO_ID = AIN_TMO_ID
LEFT JOIN TEXT_MODULE_TEXTS ON TMT_ID = TMO_TMT_ID

WHERE
LGS_STR_ID = @STR_ID
GROUP BY
LA_ART_ID,
ACR_ART_ID
LIMIT
100
;

Либо реализовать так : маленький запрос на выборку id товаров, формирование массива в php, подстановка этого массива в 4 другие запроса, обработка каждого результата, формирование 4 массивов ну и собственно разбор их в шаблоне.
Вот пример пары из них
SELECT
DES_TEXTS.TEX_TEXT AS CRITERIA_DES_TEXT,
IFNULL(DES_TEXTS2.TEX_TEXT, ACR_VALUE) AS CRITERIA_VALUE_TEXT,
ACR_ART_ID
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 IN ('" . implode("','", array_values($ajaxRes)) ."') 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)
;

Плюсы одного запроса :
-он один
-легко формируется массив данных и легко обрабатывается в шаблоне
-не нужно городить кучу кода по обработке всех 4-х

Плюсы 5 запросов:
- легкие в отладке, тк если все объеденить в один сложно отслеживать ошибки в выводе результатов
Формирование страницы происходит примерно за одинаковое время что там, что там. +- 3-5 сек если товаров около 100, и до десятых секудны если до 2-3

Так вот хотел бы поинтересоваться, вообще такой запрос приемлимый со столькими объединениями? Или лучше все таки по хуже в обработке, но разбить на несколько частей этот запрос?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.