powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / долго выполняется SELECT
8 сообщений из 8, страница 1 из 1
долго выполняется SELECT
    #33242800
SafonovAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, всем.

У меня есть таблица с данными по месяцам. Нужно выбрать данные за квартал, так чтобы месяца были в столбцах. Делаю запрос:

Код: plaintext
1.
SELECT distinct t3.stat_id, t1.Plan as P1, t2.Plan as P2, t3.Plan as P3 from table as t1, table as t2, table as t3
where (t1.year= 2005 )and(t1.month= 1 )and (t2.month= 2 )and(t3.month= 3 )and(t1.stat_id=t2.stat_id)and(t2.stat_id=t3.stat_id)

Статей всего около 450.(т.е. 450 записей для каждого месяца. ИМХО очень не много). Без индекса запрос выполнялся около 3 минут. Построил индекс составной (year, month, stat_id). Запрос теперь выполняется окло 20 сек.
Как можно ускорить выполнение запроса ? Может индекс нужен другой ?
Может быть эту задачу можно решить другим запросом ?
...
Рейтинг: 0 / 0
долго выполняется SELECT
    #33243146
max(id)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так должно быть быстрее :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT t.stat_id, 
       sum(IFNULL(IF(t.month= 1 ,t.Plan, 0 ), 0 ) AS P1,
       sum(IFNULL(IF(t.month= 2 ,t.Plan, 0 ), 0 ) AS P2, 
       sum(IFNULL(IF(t.month= 3 ,t.Plan, 0 ), 0 ) AS P3
FROM table as t1, table as t2, table as t
WHERE t.year= 2005  
  AND t.month between  1  and  3 
GROUP BY t.stat_id
...
Рейтинг: 0 / 0
долго выполняется SELECT
    #33243166
max(id)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения. Не тот запрос. ;-)) Вот исправленный :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT t.stat_id, 
       SUM(IFNULL(IF(t.month= 1 ,t.Plan, 0 ), 0 ) AS P1,
       SUM(IFNULL(IF(t.month= 2 ,t.Plan, 0 ), 0 ) AS P2, 
       SUM(IFNULL(IF(t.month= 3 ,t.Plan, 0 ), 0 ) AS P3
FROM table AS t
WHERE t.year= 2005  
  AND t.month BETWEEN  1  AND  3 
GROUP BY t.stat_id
...
Рейтинг: 0 / 0
долго выполняется SELECT
    #33243481
SafonovAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
max(id)Прошу прощения. Не тот запрос. ;-)) Вот исправленный :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT t.stat_id, 
       SUM(IFNULL(IF(t.month= 1 ,t.Plan, 0 ), 0 ) AS P1,
       SUM(IFNULL(IF(t.month= 2 ,t.Plan, 0 ), 0 ) AS P2, 
       SUM(IFNULL(IF(t.month= 3 ,t.Plan, 0 ), 0 ) AS P3
FROM table AS t
WHERE t.year= 2005  
  AND t.month BETWEEN  1  AND  3 
GROUP BY t.stat_id


Я так понимаю результаты этого запроса нельзя редактировать ? По крайней мере у меня редактировать не получилось (даже без SUM)...
...
Рейтинг: 0 / 0
долго выполняется SELECT
    #33243862
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мб EXPLAIN для запроса приведёте?
...
Рейтинг: 0 / 0
долго выполняется SELECT
    #33244843
SafonovAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlМб EXPLAIN для запроса приведёте?
Вот пожалуйста:
Код: plaintext
1.
2.
3.
4.
table type possible_keys key    key_len     ref   rows    Extra 
t1      ref   <MEMO>     indx2     9  <MEMO>  13   Using   where 
t2      ALL  <NULL>     <NULL> <NULL>  <NULL>  71136  Using where;Using temp.
t3      ALL  <NULL>     <NULL> <NULL> <NULL>  71136   Using where 
...
Рейтинг: 0 / 0
долго выполняется SELECT
    #33244879
SafonovAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlМб EXPLAIN для запроса приведёте?

Интересная штука этот Explain. Где бы почитать о его использовании ?
Как расшифровать полученную табличку ?

Добавил индекс на поле stat_id. Получился такой EXPLAIN:
Код: plaintext
1.
2.
3.
table type possible_keys key key_len    ref    rows    Extra 
t1     ref <MEMO>        indx2    14     <MEMO>    1      Using where 
t2     ALL <MEMO>     <NULL> <NULL> <NULL>  71136  Using where; Using temp.
t3     ref <MEMO>      indx_stat  5      <MEMO>   156    Using where 
Время сократилось до 5 сек.

Если создать индекс только по полю month (вместо indx2=year, month, stat_id), то EXPLAIN:
Код: plaintext
1.
2.
3.
table type possible_keys key      key_len ref      rows    Extra 
t1      ref   <MEMO>   indx_month   2     <MEMO>  5488    Using where; Using temp.
t2      ref   <MEMO>   indx_stat      5     <MEMO>  156      Using where 
t3      ref   <MEMO>   indx_stat      5     <MEMO>  156      Using where 
При этом время выполнения остается теже 5 сек.
...
Рейтинг: 0 / 0
долго выполняется SELECT
    #33245381
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так тройное перемножение, неудивительно, что запрос не быстрый...
Честно говоря, так и не понял, какие индексы у вас уже созданы, но на первый взгляд нужны два: (year, month, stat_id) и (month, stat_id).
Насчёт же EXPLAIN почитать стоит в официальной документации на сайте разработчика ( http://dev.mysql.com ), причём рекомендую читать английский вариант, переведённый, к сожалению, во многом устарел.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / долго выполняется SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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