Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
smatch
36 / 37 / 24
Регистрация: 14.12.2009
Сообщений: 184
1

Необходимо разобраться с индексами, для оптимизации sql запроса

07.09.2016, 11:23. Просмотров 790. Ответов 2
Метки нет (Все метки)

Всем добрый день, уверен Вы сможете помочь.

В общем есть БД MySql
Есть запрос который дергает несколько таблиц и выполняется долго, вот проблемная часть запроса которая долго выполняется. Там где звездочки там перечислены поля.

SQL
1
2
3
4
5
6
7
8
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 *
Я не очень вкуриваю тему индексов.
Делал Explain всего запроса.
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1PRIMARY<derived2>systemNULLNULLNULLNULL1Using temporary; Using filesort
1PRIMARYPALLNULLNULLNULLNULL134021Using where
1PRIMARYEIrefCodeCode202func1 
1PRIMARYLGindexNULLParentId12NULL5216Using index
1PRIMARYOGeq_refPRIMARYPRIMARY4LG.ParentId1 
1PRIMARYLFDindexNULLParentId12NULL5216Using index
1PRIMARYOFDeq_refPRIMARYPRIMARY4LFD.ParentId1 
1PRIMARYLDindexNULLParentId12NULL5216Using index
1PRIMARYODeq_refPRIMARYPRIMARY4LD.ParentId1 
1PRIMARYLNindexNULLParentId12NULL5216Using index
1PRIMARYONDeq_refPRIMARYPRIMARY4LN.ParentId1 
1PRIMARYLMindexNULLParentId12NULL5216Using index
1PRIMARYOMeq_refPRIMARYPRIMARY4LM.ParentId1 
1PRIMARYLCindexNULLParentId12NULL5216Using index
1PRIMARYOCeq_refPRIMARYPRIMARY4LC.ParentId1 
1PRIMARYLETindexNULLParentId12NULL5216Using index
1PRIMARYOETeq_refPRIMARYPRIMARY4LET.ParentId1 
9SUBQUERYLinkTypeconstCODECODE12const1 
8SUBQUERYLinkTypeconstCODECODE12const1 
7SUBQUERYLinkTypeconstCODECODE12const1 
6SUBQUERYLinkTypeconstCODECODE12const1 
5SUBQUERYLinkTypeconstCODECODE12const1 
4SUBQUERYLinkTypeconstCODECODE12const1 
3SUBQUERYLinkTypeconstCODECODE12const1 
2DERIVEDPriceDaterangeNULLDocId4NULL9Using index for group-by

Подскажите какие поля индексировать и каким способом лучше, как делать составные индексы.
Так сказать на практике объясните
Заранее спасибо.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2016, 11:23
Ответы с готовыми решениями:

Необходимо реализовать два запроса к вашей БД с использованием языка SQL
Здравствуйте,помогите пожалуйста создать два запроса SQL. 1)14. Отобрать из...

Создание SQL запроса для БД
Имеется 2БД с полями : 1)Платежи (Номер квитанции, Вид платежа, сумма платежа,...

Как указать строки для выполнения SQL запроса?
Как указать строки для выполнения SQL запроса НАЙТИ И ЗАМЕНИТЬ. Нужно замену...

Ошибка SQL запроса #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax t
Помогите пожалуйста! CREATE TABLE `tickets` ( `id` int(4) NOT NULL...

пытаюсь разобраться с SQL
Подскажите, какую-нибудь хорошую или отличную книгу по SQL!

2
Anvano
212 / 188 / 91
Регистрация: 12.05.2016
Сообщений: 553
08.09.2016, 07:45 2
Лучший ответ Сообщение было отмечено smatch как решение

Решение

1) Сколько времени выполняется вложенный запрос с группировкой ?
SQL
1
2
3
SELECT DocId, MAX(DatePrice) AS DatePrice
FROM PriceDate
GROUP BY DocId
и сколько записей он возвращает.
Просто если всё время уходит на него, то дальше смысла нет ковыряться, надо денормализовывать группировку.

2) Далее, как минимум, у вас фуллскан по Price идет. С приличным количеством строк.
Сделайте индекс по Price.DocId

3) Мне еще не нравится func в столбце ref для таблицы EncItems - это значит какое-то преобразование идет, что не есть гуд в общем случае.
После EXPLAIN должен был быть еще раздел Notes ... в котором конвертированный текст запроса во внутренний формат выводится, вы его не привели, там обычно видно наложенное преобразование.
Может кодировка столбцов в Price.Code и EncItems.Code не совпадает, или у них вообще тип разный.
Короче, возможно стоит пустить джоин по столбцу EncItems.DocId создав на него индекс.
1
smatch
36 / 37 / 24
Регистрация: 14.12.2009
Сообщений: 184
13.09.2016, 11:25  [ТС] 3
Anvano,
Спасибо, да там еще вкурил несколько таблиц поменял им индексы, в итоге запрос стал обрабатываться вместо 45 сек за 0,2 сек.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2016, 11:25

Разобраться в SQL запросе
Всем Привет, у меня есть такой запрос выводит имена и количество заказов. Не...

SQL запрос не могу разобраться
В какой то теме нашел запрос организовал в своей бд что типа поиска. Что...

Ошибка запроса sql
сама ощибка : #1064 - You have an error in your SQL syntax; check the manual...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru