powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите усовершенствовать сложный запрос
21 сообщений из 21, страница 1 из 1
Помогите усовершенствовать сложный запрос
    #39186561
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;
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186566
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;


Оракл?
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186581
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Результат 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
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186584
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MySQL
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186605
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю почему не использует индекс COUNTRY_DESIGNATIONS там есть KEY CDS_TEX_ID,CDS_ID а проходит всю таблицу
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186616
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andru9000Не понимаю почему не использует индекс COUNTRY_DESIGNATIONS там есть KEY CDS_TEX_ID,CDS_ID а проходит всю таблицу

ЕКСПЛАЙН говорит что индекса по CDS_ID нету..
посмотрите:
SHOW CREATE TABLE COUNTRY_DESIGNATIONS;
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186631
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 почему то не используется.
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186632
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andru9000Нужно ускорить выполнение такого запроса, что можно в нем изменить для ускорения


Попробуй удалить всё от "SELECT" до "TYP_CCM", включительно.
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186656
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблему с индексами решил вместо составного сделал 2 раздельных индекса CDS_ID CDS_TEXT_ID индексы начали использоваться
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186659
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
шутку понял а поделу
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186701
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 никому не нужен (в этом селекте)
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186705
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andru9000Проблему с индексами решил вместо составного сделал 2 раздельных индекса CDS_ID CDS_TEXT_ID индексы начали использоваться

...ну вот и ладушки...
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186949
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,
индекс по CDS_TEX_ID пришел с базой, хочу добавить составной CDS_ID CDS_LNG_ID вопрос какой столбец в индексе ставить первым тот что в join или тот что в where
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39186951
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И есть ли смысл в таком составном индексе?
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39187031
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andru9000И есть ли смысл в таком составном индексе?


да, двоийной индекс имеет смысл для этого селекта.
Какую колонку ставить первой -- вопрос открытый.
Надо проверить какая колнка более селективная
(одна из проверок: где больше уникальных значений),
и ее поставить первой. Заметим, что для друзих запросов
возможно порядок должен быть другой.
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39187395
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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..............
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39187396
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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..............


насчет локов и смены движка -- я пас. но есть другие идеи:

для отладки полезно начать с одного джоинта и постепенно
добавлять по одной таблице:
замерять скорость , смотреть ЕКСПЛАЙН....
в какой-то момнет скорость может резко провалится.
Если есть провал с ним и надо разбиратся.
Сейчас то совсем непонятно где теряется скорость

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

Да, и еше -- чем больше запрос, чем больше джоинтов -- оптимизатору
труднее и труднее найти оптимальный вариант.
Посмотрите если можно рабить запрос на части.
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39187552
andru9000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc, Created_tmp_disk_tables 1 как перенести временную таблицу в память я увеличивал max_heap_table_size = 64M не помогает
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39187577
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andru9000javajdbc, Created_tmp_disk_tables 1 как перенести временную таблицу в память я увеличивал max_heap_table_size = 64M не помогает


к сожалению я не специалист по контролю памяти.
да еще и в цейтноте....

надеюсь ктонибу из специалистов ответит....
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39187794
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andru9000javajdbc,
индекс по CDS_TEX_ID пришел с базой, хочу добавить составной CDS_ID CDS_LNG_ID вопрос какой столбец в индексе ставить первым тот что в join или тот что в where

не нужен такой составной индекс.
потому что индекс используется либо для where, либо для join, но не для обоих одновременно.
...
Рейтинг: 0 / 0
Помогите усовершенствовать сложный запрос
    #39188707
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivandru9000javajdbc,
индекс по CDS_TEX_ID пришел с базой, хочу добавить составной CDS_ID CDS_LNG_ID вопрос какой столбец в индексе ставить первым тот что в join или тот что в where

не нужен такой составной индекс.
потому что индекс используется либо для where, либо для join, но не для обоих одновременно.


конкретно на эту таблицу этот джоинт обычный, НЕ лефт.
т.е условия в JOIN ON и в WHERE теоретически можно переписать
и туда и сюда. Догадается ли оптимизатор...а почему нет?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите усовершенствовать сложный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]