X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Лучше один большой запрос или 5 маленьких?
Эдик_hb
Эдик_hb
Topic Starter сообщение 28.12.2011, 20:24; Ответить: Эдик_hb
Сообщение #1


Здравствуйте. Вот столкнулся с проблемой:
На последнем шаге нужно вывести товар. Но так как база очень обширная (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

Так вот хотел бы поинтересоваться, вообще такой запрос приемлимый со столькими объединениями? Или лучше все таки по хуже в обработке, но разбить на несколько частей этот запрос?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 28.12.2011, 22:47; Ответить: alexdrob
Сообщение #2


ну так возьмите и замерьте скорость выполнения запросов)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
CandyDandy
CandyDandy
сообщение 29.12.2011, 1:21; Ответить: CandyDandy
Сообщение #3


А есть ли какое то преимущество в том чтобы хранить все характеристики товара в разных таблицах?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Эдик_hb
Эдик_hb
Topic Starter сообщение 29.12.2011, 1:58; Ответить: Эдик_hb
Сообщение #4


alexdrob, так я замерял- особой разницы не было что для малого количества товаров, что для большого. Тут вопрос более в красивости и пригодности такого метода. Ну и плюс я не знаю как большой запрос будет себя вести реально в интернете на сервере, сейчас то у меня все на локалке.

CandyDandy, преимущество есть, если товаров около 3 млн =) Тут база товаров- tecdoc- все запчасти мира в ней сложены
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Bustle_hb
Bustle_hb
сообщение 29.12.2011, 2:28; Ответить: Bustle_hb
Сообщение #5


Где то читал что для MySQL лучше использовать не длинные запросы.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 29.12.2011, 9:15; Ответить: Witu
Сообщение #6


(Эдик_hb @ 28.12.2011, 23:24) *
LINK_ART

чем 1 такой офигенно длинный запрос писать проще вот так

SELECT mail.name, (SELECT page_news.id FROM page_news WHERE page_news.mail=mail.id), (SELECT ********) FROM mail AS mail /*WHERE*/;


- кол-во выбираемых столбцов должно быть одинаковым для всех таблиц
+ работает примерно в 10 раз быстрее чем LEFT JOIN при таком кол-ве

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

советую скачать
http://www.devart.com/ru/dbforge/mysql/studio/
там есть профилировщик запросов который выдает очень подробную информацию о том на что сколько МС было потрачено


на мой взгляд JOINы оправданны только при селекте только из 2-3 таблиц не более

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Создать видеоканал лучше в ютуб или телеграм?
10 uahomka 1786 24.3.2024, 4:21
автор: Alexand3r
Открытая тема (нет новых ответов) Запрос на бесплатные полезности
7 Tia2 1841 23.3.2024, 11:27
автор: Alexand3r
Открытая тема (нет новых ответов) Если статья не в индексе Google - она уникальна или нет?
2 uahomka 800 20.3.2024, 11:17
автор: Vmir
Открытая тема (нет новых ответов) Где больше пробив на кликандер или попандер или попап трафике?
1 Boymaster 614 20.3.2024, 9:50
автор: Skyworker
Горячая тема (нет новых ответов) Выполню качественную верстку макетов или разработка собственного, быстро и не дорого
от 45$
123 webche 116749 17.3.2024, 7:09
автор: webche


 



RSS Текстовая версия Сейчас: 29.3.2024, 6:40
Дизайн