|
|
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
Нужно ускорить выполнение такого запроса, что можно в нем изменить для ускорения SELECT TYP_ID, MOD_ID, MFA_BRAND, DES_TEXTS7.TEX_TEXT AS MOD_CDS_TEXT, DES_TEXTS.TEX_TEXT AS TYP_CDS_TEXT, TYP_PCON_START, TYP_PCON_END, TYP_CCM, TYP_KW_FROM, TYP_HP_FROM, TYP_CYLINDERS, ENGINES.ENG_CODE, DES_TEXTS3.TEX_TEXT AS TYP_FUEL_DES_TEXT, IFNULL(DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS TYP_BODY_DES_TEXT FROM LINK_ART INNER JOIN LINK_LA_TYP ON LAT_LA_ID = LA_ID INNER JOIN TYPES ON TYP_ID = LAT_TYP_ID INNER JOIN COUNTRY_DESIGNATIONS ON COUNTRY_DESIGNATIONS.CDS_ID = TYP_CDS_ID INNER JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = COUNTRY_DESIGNATIONS.CDS_TEX_ID INNER JOIN MODELS ON MOD_ID = TYP_MOD_ID INNER JOIN MANUFACTURERS ON MFA_ID = MOD_MFA_ID INNER JOIN COUNTRY_DESIGNATIONS AS COUNTRY_DESIGNATIONS2 ON COUNTRY_DESIGNATIONS2.CDS_ID = MOD_CDS_ID INNER JOIN DES_TEXTS AS DES_TEXTS7 ON DES_TEXTS7.TEX_ID = COUNTRY_DESIGNATIONS2.CDS_TEX_ID LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = TYP_KV_ENGINE_DES_ID LEFT JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = TYP_KV_FUEL_DES_ID LEFT JOIN DES_TEXTS AS DES_TEXTS3 ON DES_TEXTS3.TEX_ID = DESIGNATIONS2.DES_TEX_ID LEFT JOIN LINK_TYP_ENG ON LTE_TYP_ID = TYP_ID LEFT JOIN ENGINES ON ENG_ID = LTE_ENG_ID LEFT JOIN DESIGNATIONS AS DESIGNATIONS3 ON DESIGNATIONS3.DES_ID = TYP_KV_BODY_DES_ID LEFT JOIN DES_TEXTS AS DES_TEXTS4 ON DES_TEXTS4.TEX_ID = DESIGNATIONS3.DES_TEX_ID LEFT JOIN DESIGNATIONS AS DESIGNATIONS4 ON DESIGNATIONS4.DES_ID = TYP_KV_MODEL_DES_ID LEFT JOIN DES_TEXTS AS DES_TEXTS5 ON DES_TEXTS5.TEX_ID = DESIGNATIONS4.DES_TEX_ID WHERE LA_ART_ID = 4530692 AND COUNTRY_DESIGNATIONS.CDS_LNG_ID = 16 AND COUNTRY_DESIGNATIONS2.CDS_LNG_ID = 16 AND (DESIGNATIONS.DES_LNG_ID IS NULL OR DESIGNATIONS.DES_LNG_ID = 16) AND (DESIGNATIONS2.DES_LNG_ID IS NULL OR DESIGNATIONS2.DES_LNG_ID = 16 ) AND (DESIGNATIONS3.DES_LNG_ID IS NULL OR DESIGNATIONS3.DES_LNG_ID = 16) AND (DESIGNATIONS4.DES_LNG_ID IS NULL OR DESIGNATIONS4.DES_LNG_ID = 16) AND DES_TEXTS.TEX_TEXT NOT LIKE 'ORA-%' ORDER BY MFA_BRAND, MOD_CDS_TEXT, TYP_CDS_TEXT, TYP_PCON_START, TYP_CCM; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 20:35 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000Нужно ускорить выполнение такого запроса, что можно в нем изменить для ускорения SELECT TYP_ID, MOD_ID, MFA_BRAND, DES_TEXTS7.TEX_TEXT AS MOD_CDS_TEXT, DES_TEXTS.TEX_TEXT AS TYP_CDS_TEXT, TYP_PCON_START, TYP_PCON_END, TYP_CCM, TYP_KW_FROM, TYP_HP_FROM, TYP_CYLINDERS, ENGINES.ENG_CODE, DES_TEXTS3.TEX_TEXT AS TYP_FUEL_DES_TEXT, IFNULL(DES_TEXTS4.TEX_TEXT, DES_TEXTS5.TEX_TEXT) AS TYP_BODY_DES_TEXT FROM LINK_ART INNER JOIN LINK_LA_TYP ON LAT_LA_ID = LA_ID INNER JOIN TYPES ON TYP_ID = LAT_TYP_ID INNER JOIN COUNTRY_DESIGNATIONS ON COUNTRY_DESIGNATIONS.CDS_ID = TYP_CDS_ID INNER JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = COUNTRY_DESIGNATIONS.CDS_TEX_ID INNER JOIN MODELS ON MOD_ID = TYP_MOD_ID INNER JOIN MANUFACTURERS ON MFA_ID = MOD_MFA_ID INNER JOIN COUNTRY_DESIGNATIONS AS COUNTRY_DESIGNATIONS2 ON COUNTRY_DESIGNATIONS2.CDS_ID = MOD_CDS_ID INNER JOIN DES_TEXTS AS DES_TEXTS7 ON DES_TEXTS7.TEX_ID = COUNTRY_DESIGNATIONS2.CDS_TEX_ID LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = TYP_KV_ENGINE_DES_ID LEFT JOIN DESIGNATIONS AS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = TYP_KV_FUEL_DES_ID LEFT JOIN DES_TEXTS AS DES_TEXTS3 ON DES_TEXTS3.TEX_ID = DESIGNATIONS2.DES_TEX_ID LEFT JOIN LINK_TYP_ENG ON LTE_TYP_ID = TYP_ID LEFT JOIN ENGINES ON ENG_ID = LTE_ENG_ID LEFT JOIN DESIGNATIONS AS DESIGNATIONS3 ON DESIGNATIONS3.DES_ID = TYP_KV_BODY_DES_ID LEFT JOIN DES_TEXTS AS DES_TEXTS4 ON DES_TEXTS4.TEX_ID = DESIGNATIONS3.DES_TEX_ID LEFT JOIN DESIGNATIONS AS DESIGNATIONS4 ON DESIGNATIONS4.DES_ID = TYP_KV_MODEL_DES_ID LEFT JOIN DES_TEXTS AS DES_TEXTS5 ON DES_TEXTS5.TEX_ID = DESIGNATIONS4.DES_TEX_ID WHERE LA_ART_ID = 4530692 AND COUNTRY_DESIGNATIONS.CDS_LNG_ID = 16 AND COUNTRY_DESIGNATIONS2.CDS_LNG_ID = 16 AND (DESIGNATIONS.DES_LNG_ID IS NULL OR DESIGNATIONS.DES_LNG_ID = 16) AND (DESIGNATIONS2.DES_LNG_ID IS NULL OR DESIGNATIONS2.DES_LNG_ID = 16 ) AND (DESIGNATIONS3.DES_LNG_ID IS NULL OR DESIGNATIONS3.DES_LNG_ID = 16) AND (DESIGNATIONS4.DES_LNG_ID IS NULL OR DESIGNATIONS4.DES_LNG_ID = 16) AND DES_TEXTS.TEX_TEXT NOT LIKE 'ORA-%' ORDER BY MFA_BRAND, MOD_CDS_TEXT, TYP_CDS_TEXT, TYP_PCON_START, TYP_CCM; Оракл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 20:50 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
Результат EXPLAIN 1 SIMPLE LINK_ART ref PRIMARY,LA_ART_ID LA_ART_ID 4 const 2 Using temporary; Using filesort 1 SIMPLE LINK_LA_TYP ref PRIMARY,LAT_LA_ID LAT_LA_ID 4 LINK_ART.LA_ID 18 NULL 1 SIMPLE TYPES eq_ref PRIMARY,TYP_MOD_ID,TYP_CDS_ID,TYP_ID PRIMARY 4 LINK_LA_TYP.LAT_TYP_ID 1 NULL 1 SIMPLE MODELS eq_ref PRIMARY,MOD_MFA_ID,MOD_CDS_ID,MOD_ID PRIMARY 4 TYPES.TYP_MOD_ID 1 Using where 1 SIMPLE MANUFACTURERS eq_ref PRIMARY,MFA_ID PRIMARY 2 MODELS.MOD_MFA_ID 1 NULL 1 SIMPLE DESIGNATIONS ref PRIMARY,DES_ID DES_ID 4 TYPES.TYP_KV_ENGINE_DES_ID 22 Using where 1 SIMPLE DESIGNATIONS2 ref PRIMARY,DES_ID DES_ID 4 TYPES.TYP_KV_FUEL_DES_ID 22 Using where 1 SIMPLE DES_TEXTS3 eq_ref PRIMARY PRIMARY 4 DESIGNATIONS2.DES_TEX_ID 1 NULL 1 SIMPLE LINK_TYP_ENG ref PRIMARY PRIMARY 4 LINK_LA_TYP.LAT_TYP_ID 705 Using index 1 SIMPLE ENGINES eq_ref PRIMARY PRIMARY 4 LINK_TYP_ENG.LTE_ENG_ID 1 NULL 1 SIMPLE DESIGNATIONS3 ref PRIMARY,DES_ID DES_ID 4 TYPES.TYP_KV_BODY_DES_ID 22 Using where 1 SIMPLE DES_TEXTS4 eq_ref PRIMARY PRIMARY 4 DESIGNATIONS3.DES_TEX_ID 1 NULL 1 SIMPLE DESIGNATIONS4 ref PRIMARY,DES_ID DES_ID 4 TYPES.TYP_KV_MODEL_DES_ID 22 Using where 1 SIMPLE DES_TEXTS5 eq_ref PRIMARY PRIMARY 4 DESIGNATIONS4.DES_TEX_ID 1 NULL 1 SIMPLE COUNTRY_DESIGNATIONS ALL CDS_TEX_ID NULL NULL NULL 6172606 Using where; Using join buffer (Block Nested Loop) 1 SIMPLE DES_TEXTS eq_ref PRIMARY PRIMARY 4 COUNTRY_DESIGNATIONS.CDS_TEX_ID 1 Using where 1 SIMPLE COUNTRY_DESIGNATIONS2 ALL CDS_TEX_ID NULL NULL NULL 6172606 Using where; Using join buffer (Block Nested Loop) 1 SIMPLE DES_TEXTS7 eq_ref PRIMARY PRIMARY 4 COUNTRY_DESIGNATIONS2.CDS_TEX_ID 1 NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 21:26 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
MySQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 21:26 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
Не понимаю почему не использует индекс COUNTRY_DESIGNATIONS там есть KEY CDS_TEX_ID,CDS_ID а проходит всю таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 22:01 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000Не понимаю почему не использует индекс COUNTRY_DESIGNATIONS там есть KEY CDS_TEX_ID,CDS_ID а проходит всю таблицу ЕКСПЛАЙН говорит что индекса по CDS_ID нету.. посмотрите: SHOW CREATE TABLE COUNTRY_DESIGNATIONS; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 22:29 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
javajdbc, COUNTRY_DESIGNATIONS CREATE TABLE `COUNTRY_DESIGNATIONS` ( `CDS_ID` int(11) NOT NULL, `CDS_LNG_ID` smallint(6) NOT NULL, `CDS_TEX_ID` int(11) NOT NULL, KEY `CDS_TEX_ID` (`CDS_TEX_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 один ключ CDS_ID я удалил, второй CDS_TEX_ID почему то не используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 22:49 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000Нужно ускорить выполнение такого запроса, что можно в нем изменить для ускорения Попробуй удалить всё от "SELECT" до "TYP_CCM", включительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 22:51 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
Проблему с индексами решил вместо составного сделал 2 раздельных индекса CDS_ID CDS_TEXT_ID индексы начали использоваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 23:19 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
MasterZiv, шутку понял а поделу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 23:25 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000javajdbc, COUNTRY_DESIGNATIONS CREATE TABLE `COUNTRY_DESIGNATIONS` ( `CDS_ID` int(11) NOT NULL, `CDS_LNG_ID` smallint(6) NOT NULL, `CDS_TEX_ID` int(11) NOT NULL, KEY `CDS_TEX_ID` (`CDS_TEX_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 один ключ CDS_ID я удалил, второй CDS_TEX_ID почему то не используется. ...у вас связка по CDS_ID. Индекс по CDS_TEX_ID никому не нужен (в этом селекте) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 01:25 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000Проблему с индексами решил вместо составного сделал 2 раздельных индекса CDS_ID CDS_TEXT_ID индексы начали использоваться ...ну вот и ладушки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 01:39 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
javajdbc, индекс по CDS_TEX_ID пришел с базой, хочу добавить составной CDS_ID CDS_LNG_ID вопрос какой столбец в индексе ставить первым тот что в join или тот что в where ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 19:08 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
И есть ли смысл в таком составном индексе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 19:15 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000И есть ли смысл в таком составном индексе? да, двоийной индекс имеет смысл для этого селекта. Какую колонку ставить первой -- вопрос открытый. Надо проверить какая колнка более селективная (одна из проверок: где больше уникальных значений), и ее поставить первой. Заметим, что для друзих запросов возможно порядок должен быть другой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 01:00 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
javajdbc, Спасибо за помощь, И еще вопрос если работает база только с select запросами похожими на этот стоит ли ее перевести на innob или myisam быстрее? Также есть другой запрос с 15 одинаковыми Union, что можно изменить в запросе или может разбить его на мелкие, по explain все индексы используются количество прочитаных строк до 7 на таблицу, но обработка почему то 5 сек. Handler_read_key 34000 а Handler_read_next 53000 Handler_external_lock 240 Handler_read_rnd_next 19 Handler_write 19. И откуда Handler_external_lock 240 если задан skip-external-locking? SELECT LA_ART_ID AS AID, DES_TEXTS.TEX_TEXT CRITERIA, IFNULL(DES_TEXTS2.TEX_TEXT, LAC_VALUE) VALUE FROM LINK_LA_TYP INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID LEFT JOIN LA_CRITERIA ON LAC_LA_ID = LA_ID LEFT JOIN CRITERIA ON CRI_ID = LAC_CRI_ID LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = CRI_SHORT_DES_ID AND DESIGNATIONS.DES_LNG_ID = 16 LEFT JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID LEFT JOIN DESIGNATIONS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = LAC_KV_DES_ID AND DESIGNATIONS2.DES_LNG_ID = 16 LEFT JOIN DES_TEXTS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID WHERE LAT_TYP_ID = 4642 AND LA_ART_ID = 1087597 UNION SELECT LA_ART_ID AS AID, DES_TEXTS.TEX_TEXT CRITERIA.............. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 03:43 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000javajdbc, Спасибо за помощь, И еще вопрос если работает база только с select запросами похожими на этот стоит ли ее перевести на innob или myisam быстрее? Также есть другой запрос с 15 одинаковыми Union, что можно изменить в запросе или может разбить его на мелкие, по explain все индексы используются количество прочитаных строк до 7 на таблицу, но обработка почему то 5 сек. Handler_read_key 34000 а Handler_read_next 53000 Handler_external_lock 240 Handler_read_rnd_next 19 Handler_write 19. И откуда Handler_external_lock 240 если задан skip-external-locking? SELECT LA_ART_ID AS AID, DES_TEXTS.TEX_TEXT CRITERIA, IFNULL(DES_TEXTS2.TEX_TEXT, LAC_VALUE) VALUE FROM LINK_LA_TYP INNER JOIN LINK_ART ON LA_ID = LAT_LA_ID LEFT JOIN LA_CRITERIA ON LAC_LA_ID = LA_ID LEFT JOIN CRITERIA ON CRI_ID = LAC_CRI_ID LEFT JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = CRI_SHORT_DES_ID AND DESIGNATIONS.DES_LNG_ID = 16 LEFT JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID LEFT JOIN DESIGNATIONS DESIGNATIONS2 ON DESIGNATIONS2.DES_ID = LAC_KV_DES_ID AND DESIGNATIONS2.DES_LNG_ID = 16 LEFT JOIN DES_TEXTS DES_TEXTS2 ON DES_TEXTS2.TEX_ID = DESIGNATIONS2.DES_TEX_ID WHERE LAT_TYP_ID = 4642 AND LA_ART_ID = 1087597 UNION SELECT LA_ART_ID AS AID, DES_TEXTS.TEX_TEXT CRITERIA.............. насчет локов и смены движка -- я пас. но есть другие идеи: для отладки полезно начать с одного джоинта и постепенно добавлять по одной таблице: замерять скорость , смотреть ЕКСПЛАЙН.... в какой-то момнет скорость может резко провалится. Если есть провал с ним и надо разбиратся. Сейчас то совсем непонятно где теряется скорость Другой подход -- пре-агрегация, де-нормализация вверх и вниз, изменение структур данных. Тут надо иметь контроль над таблицами и запросами. Ну и хорошо понимать логику запроса. Да, и еше -- чем больше запрос, чем больше джоинтов -- оптимизатору труднее и труднее найти оптимальный вариант. Посмотрите если можно рабить запрос на части. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 05:26 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
javajdbc, Created_tmp_disk_tables 1 как перенести временную таблицу в память я увеличивал max_heap_table_size = 64M не помогает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 16:49 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000javajdbc, Created_tmp_disk_tables 1 как перенести временную таблицу в память я увеличивал max_heap_table_size = 64M не помогает к сожалению я не специалист по контролю памяти. да еще и в цейтноте.... надеюсь ктонибу из специалистов ответит.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 18:38 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
andru9000javajdbc, индекс по CDS_TEX_ID пришел с базой, хочу добавить составной CDS_ID CDS_LNG_ID вопрос какой столбец в индексе ставить первым тот что в join или тот что в where не нужен такой составной индекс. потому что индекс используется либо для where, либо для join, но не для обоих одновременно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2016, 08:18 |
|
||
|
Помогите усовершенствовать сложный запрос
|
|||
|---|---|---|---|
|
#18+
MasterZivandru9000javajdbc, индекс по CDS_TEX_ID пришел с базой, хочу добавить составной CDS_ID CDS_LNG_ID вопрос какой столбец в индексе ставить первым тот что в join или тот что в where не нужен такой составной индекс. потому что индекс используется либо для where, либо для join, но не для обоих одновременно. конкретно на эту таблицу этот джоинт обычный, НЕ лефт. т.е условия в JOIN ON и в WHERE теоретически можно переписать и туда и сюда. Догадается ли оптимизатор...а почему нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2016, 02:09 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39186949&tid=1832077]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
289ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 610ms |

| 0 / 0 |
