Необходимо разобраться с индексами, для оптимизации sql запроса - MySQL
Формулировка задачи:
Всем добрый день, уверен Вы сможете помочь.
В общем есть БД MySql
Есть запрос который дергает несколько таблиц и выполняется долго, вот проблемная часть запроса которая долго выполняется. Там где звездочки там перечислены поля.
Я не очень вкуриваю тему индексов.
Делал Explain всего запроса.
Подскажите какие поля индексировать и каким способом лучше, как делать составные индексы.
Так сказать на практике объясните
Заранее спасибо.
SELECT * FROM ( SELECT DocId, MAX(DatePrice) AS DatePrice FROM PriceDate GROUP BY DocId ) NP INNER JOIN Price P ON P.DocID = NP.DocId AND NP.DatePrice = P.PriceDate LEFT JOIN EncItems EI ON EI.DocId = P.DocID AND EI.Code = P.CodeID GROUP BY *
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
1 | PRIMARY | <derived2> | system | NULL | NULL | NULL | NULL | 1 | Using temporary; Using filesort |
1 | PRIMARY | P | ALL | NULL | NULL | NULL | NULL | 134021 | Using where |
1 | PRIMARY | EI | ref | Code | Code | 202 | func | 1 | |
1 | PRIMARY | LG | index | NULL | ParentId | 12 | NULL | 5216 | Using index |
1 | PRIMARY | OG | eq_ref | PRIMARY | PRIMARY | 4 | LG.ParentId | 1 | |
1 | PRIMARY | LFD | index | NULL | ParentId | 12 | NULL | 5216 | Using index |
1 | PRIMARY | OFD | eq_ref | PRIMARY | PRIMARY | 4 | LFD.ParentId | 1 | |
1 | PRIMARY | LD | index | NULL | ParentId | 12 | NULL | 5216 | Using index |
1 | PRIMARY | OD | eq_ref | PRIMARY | PRIMARY | 4 | LD.ParentId | 1 | |
1 | PRIMARY | LN | index | NULL | ParentId | 12 | NULL | 5216 | Using index |
1 | PRIMARY | OND | eq_ref | PRIMARY | PRIMARY | 4 | LN.ParentId | 1 | |
1 | PRIMARY | LM | index | NULL | ParentId | 12 | NULL | 5216 | Using index |
1 | PRIMARY | OM | eq_ref | PRIMARY | PRIMARY | 4 | LM.ParentId | 1 | |
1 | PRIMARY | LC | index | NULL | ParentId | 12 | NULL | 5216 | Using index |
1 | PRIMARY | OC | eq_ref | PRIMARY | PRIMARY | 4 | LC.ParentId | 1 | |
1 | PRIMARY | LET | index | NULL | ParentId | 12 | NULL | 5216 | Using index |
1 | PRIMARY | OET | eq_ref | PRIMARY | PRIMARY | 4 | LET.ParentId | 1 | |
9 | SUBQUERY | LinkType | const | CODE | CODE | 12 | const | 1 | |
8 | SUBQUERY | LinkType | const | CODE | CODE | 12 | const | 1 | |
7 | SUBQUERY | LinkType | const | CODE | CODE | 12 | const | 1 | |
6 | SUBQUERY | LinkType | const | CODE | CODE | 12 | const | 1 | |
5 | SUBQUERY | LinkType | const | CODE | CODE | 12 | const | 1 | |
4 | SUBQUERY | LinkType | const | CODE | CODE | 12 | const | 1 | |
3 | SUBQUERY | LinkType | const | CODE | CODE | 12 | const | 1 | |
2 | DERIVED | PriceDate | range | NULL | DocId | 4 | NULL | 9 | Using index for group-by |
Решение задачи: «Необходимо разобраться с индексами, для оптимизации sql запроса»
textual
Листинг программы
SELECT DocId, MAX(DatePrice) AS DatePrice FROM PriceDate GROUP BY DocId
Объяснение кода листинга программы
- Запрос написан на SQL языке.
- Запрос выбирает два поля: DocId и MAX(DatePrice).
- Поле DocId будет содержать идентификатор документа.
- Поле DatePrice будет содержать максимальную дату цены для каждого документа.
- Результат запроса будет содержать только уникальные записи по полю DocId.
- Запрос использует оператор GROUP BY для группировки записей по полю DocId.
- Функция MAX используется для получения максимального значения поля DatePrice для каждого группированного документа.
- Запрос выполняется на таблице PriceDate, которая содержит информацию о ценах и датах документов.
- В результате выполнения запроса будет создан список документов с их максимальными датами цен.
- Этот список может быть использован для оптимизации SQL запросов, связанных с выборкой документов по дате цены.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д