Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / можно ли с оптимизировать этот запрос? / 25 сообщений из 58, страница 1 из 3
02.07.2014, 18:52:32
    #38686128
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
Здравствуйте уважаемые ГУРУ!

Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT
                    `media_type`,
                    sum(`imp`) `imp`,
                    sum(`spend`) `spend`,
                    sum(`revenue`) `revenue`
                FROM (
                    SELECT
                        if(`s`.`media_type` = 'ded', 'ded', 'news') `media_type`,
                        `d`.`imp` `imp`,
                        if(`c`.`dsp_fee`,(`d`.`Spend`) / (100 - `c`.`dsp_fee`) / 100,`d`.`Spend`) `spend`,
                        `d`.`Revenue` `revenue`
                    FROM
                        `daily_stats` `d`
                        left join `strat` `s` on `s`.`userver_id` = `d`.`LineItemID`
                        left join `camp` `c` on `c`.`id` = `s`.`campaign_id`
                    WHERE
                        `day` BETWEEN '2014-06-01’ AND ‘2014-06-30'
                        and `demand_type` = 'exchange'
                ) `TEST`
                GROUP BY
                    `media_type`;



работает 4 минуты на локальной машине, если меняю дату выборки на 2014-06-10 то те же 4 минуты. В таблице daily_stats 10 млн записей. На реальных данных это более 30млн записей работает более 9 часов, что тут не правильно? Заранее благодарен за любой совет.
...
Рейтинг: 0 / 0
02.07.2014, 19:04:25
    #38686142
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
1) Для всех упоминаемых полей укажите имя таблицы или ее алиас
2) Для всех упоминаемых таблиц приведите их DDL, включая индексы.
3) Покажите план запроса.
4) Поясните словами, как поле `dsp_fee` взаимодействует с полем `Spend`. Есть подозрение на ошибку в арифметике.
...
Рейтинг: 0 / 0
02.07.2014, 19:04:39
    #38686143
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnews,


1. покажите
show create table ....
для всех таблиц

2. покажите EXPLAIN этого запроса.

3. в явном виде указывайте табличный алиас для всех полей.
Например из какой таблицы `day` BETWEEN '2014-06-01’ AND ‘2014-06-30' ?
...
Рейтинг: 0 / 0
02.07.2014, 19:05:37
    #38686145
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
miksoft, :-)
...
Рейтинг: 0 / 0
02.07.2014, 19:08:35
    #38686146
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
5) Какие значения вообще может принимать поле `s`.`media_type` ?
...
Рейтинг: 0 / 0
02.07.2014, 19:11:27
    #38686150
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
а этот сколько работает?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
                        if(`s`.`media_type` = 'ded', 'ded', 'news') `media_type`,
                        sum(`d`.`imp`) `imp`,
                        sum(if(`c`.`dsp_fee`,(`d`.`Spend`) / (100 - `c`.`dsp_fee`) / 100,`d`.`Spend`)) `spend`,
                        sum(`d`.`Revenue`) `revenue`

                FROM 
                        `daily_stats` `d`
                        left join `strat` `s` on `s`.`userver_id` = `d`.`LineItemID`
                        left join `camp` `c` on `c`.`id` = `s`.`campaign_id`
                    WHERE
                        `day` BETWEEN '2014-06-01' AND '2014-06-30'
                        and `demand_type` = 'exchange'
                GROUP BY
                    `media_type`;

кстати, вот тут
Код: sql
1.
if(`c`.`dsp_fee`,(`d`.`Spend`) / (100 - `c`.`dsp_fee`) / 100,`d`.`Spend`)


надо бы, наверное, сравнение какое-то вставить, нет?
...
Рейтинг: 0 / 0
02.07.2014, 19:51:13
    #38686176
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
ухх спасибо не ожидал такого отклика

Запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT
                    `media_type`,
                    sum(`impressions`) `impressions`,
                    sum(`spend`) `spend`,
                    sum(`revenue`) `revenue`
                FROM (
                    SELECT
                        if(`s`.`media_type` = 'dedicated', 'dedicated', 'newsletter') `media_type`,
                        `d`.`impressions` `impressions`,
                        if(`c`.`dsp_fee`,(`d`.`Spend`) / (100 - `c`.`dsp_fee`) / 100,`d`.`Spend`) `spend`,
                        `d`.`Revenue` `revenue`
                    FROM
                        `daily_stats` `d`
                        left join `zf_strategies` `s` on `s`.`userver_id` = `d`.`LineItemID`
                        left join `zf_campaigns` `c` on `c`.`id` = `s`.`campaign_id`
                    WHERE
                        `day` BETWEEN '2014-06-01’ AND ‘2014-06-30'
                        and `demand_type` = 'exchange'
                ) `TEST`
                GROUP BY
                    `media_type`;



EXPLAIN:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
+----+-------------+------------+--------+---------------------------+---------------------------+---------+-------------------+---------+---------------------------------+
| id | select_type | table      | type   | possible_keys             | key                       | key_len | ref               | rows    | Extra                           |
+----+-------------+------------+--------+---------------------------+---------------------------+---------+-------------------+---------+---------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL                      | NULL                      | NULL    | NULL              | 9955416 | Using temporary; Using filesort |
|  2 | DERIVED     | d          | ALL    | NULL                      | NULL                      | NULL    | NULL              | 9955416 |                                 |
|  2 | DERIVED     | s          | ref    | idx_strategies_userver_id | idx_strategies_userver_id | 4       | lfx.d.LineItemID  |       1 |                                 |
|  2 | DERIVED     | c          | eq_ref | PRIMARY                   | PRIMARY                   | 96      | lfx.s.campaign_id |       1 | Using where                     |
+----+-------------+------------+--------+---------------------------+---------------------------+---------+-------------------+---------+---------------------------------+
4 rows in set, 65535 warnings (3 min 51.89 sec)
таблицы тут описаны: http://www.describe.ru/sql.txt, не хочу тут светить то чего не смогу удалить

tanglir, ваш запрос работает

Код: plaintext
1.
2.
3.
4.
5.
6.
+------------+-------------+-----------------------+---------------+
| media_type | impressions | spend                 | revenue       |
+------------+-------------+-----------------------+---------------+

+------------+-------------+-----------------------+---------------+
3 rows in set, 1 warning (3 min 44.66 sec)
Заранее спасибо за советы, я такие запросы никогда не строил
...
Рейтинг: 0 / 0
02.07.2014, 19:59:41
    #38686180
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnewsваш запрос работаетпопробуйте group by 1, у вас алиас поля результата совпадает с названием поля таблицы
...
Рейтинг: 0 / 0
02.07.2014, 20:20:42
    #38686192
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
tanglir,

я имею в виду он работает немного быстрее, стараюсь быстро ответить и при этом попытаться поменять как посоветовал miksoft. Одно не пойму как это 2) Для всех упоминаемых таблиц приведите их DDL, включая индексы. Можно пример?
...
Рейтинг: 0 / 0
02.07.2014, 20:24:22
    #38686197
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnews,

show create table table_name

выдаёт практически то, что вы выложили + описание индексов

и покажите эксплейн моего варианта
...
Рейтинг: 0 / 0
02.07.2014, 20:44:01
    #38686204
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnews,

для начала создайте индекс по daily_stats.day
...
Рейтинг: 0 / 0
02.07.2014, 21:16:52
    #38686219
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
Обнаружил попутно баг на склфидле:

1)создаём пустую схему
2)выполняем
Код: sql
1.
select if(NULL = 'ded', 'ded', 'news')


3)нажимаем "отформатировать код", и вуаля, в окошке с кодом получаем
Код: sql
1.
2.
3.
4.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>

, при этом текст запроса теряется

Так и не нашёл там ни формы обратной связи, ни мыла. Не регистрироваться же в твиттере, чтобы им багрепорт через него отправить :)
...
Рейтинг: 0 / 0
02.07.2014, 21:17:14
    #38686220
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
tanglir,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
+----+-------------+-------+--------+-----------------------------------------------------+---------------------------+---------+-------------------+---------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                                       | key                       | key_len | ref               | rows    | Extra                                        |
+----+-------------+-------+--------+-----------------------------------------------------+---------------------------+---------+-------------------+---------+----------------------------------------------+
|  1 | SIMPLE      | d     | ALL    | un_daily_stats,Day,LineItemID                       | NULL                      | NULL    | NULL              | 9955416 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | s     | ref    | idx_strategies_userver_id,fk_strategies_campaign_id | idx_strategies_userver_id | 4       | lfx.d.LineItemID  |       1 | Using where                                  |
|  1 | SIMPLE      | c     | eq_ref | PRIMARY                                             | PRIMARY                   | 96      | lfx.s.campaign_id |       1 | Using where                                  |
+----+-------------+-------+--------+-----------------------------------------------------+---------------------------+---------+-------------------+---------+----------------------------------------------+
3 rows in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level   | Code | Message                                             |
+---------+------+-----------------------------------------------------+
| Warning | 1052 | Column 'media_type' in group statement is ambiguous |
+---------+------+-----------------------------------------------------+
1 row in set (0.00 sec)

Модератор: Пожалуйста, пользуйтесь тэгами для оформления ваших постов. В ваших же интересах сделать так, чтобы ваши посты было легче читать. Нечитаемые посты никто не любит.
...
Рейтинг: 0 / 0
02.07.2014, 21:28:57
    #38686224
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
tanglir
Код: sql
1.
select if(NULL = 'ded', 'ded', 'news')

Или уже исправили, или этот баг связан с чем-то другим. Сейчас работает исправно.
...
Рейтинг: 0 / 0
02.07.2014, 21:34:16
    #38686230
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnewsне хочу тут светить то чего не смогу удалитьТут можно воспользоваться ссылкой "сообщить моедратору" и попросить что-то удалить/отредактировать. Но срочности не обещаю.
...
Рейтинг: 0 / 0
02.07.2014, 21:37:52
    #38686234
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
miksoft,

спасибо, буду знать
...
Рейтинг: 0 / 0
02.07.2014, 21:39:35
    #38686236
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
miksoft,

это я пытался шифроваться сокращая переменные
...
Рейтинг: 0 / 0
02.07.2014, 22:18:27
    #38686253
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
javajdbc,

Извиняюсь а зачем создавать индекс для поля, которое итак вроде бы упорядочено? Или я чего-то не понимаю?
...
Рейтинг: 0 / 0
02.07.2014, 22:33:59
    #38686262
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnewsjavajdbc,

Извиняюсь а зачем создавать индекс для поля, которое итак вроде бы упорядочено? Или я чего-то не понимаю?


Или!

ОБЯЗАТЕЛЬНО создайте индекс и посмотрите результат :-)
...
Рейтинг: 0 / 0
02.07.2014, 22:45:17
    #38686266
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
javajdbcalexnewsjavajdbc,

Извиняюсь а зачем создавать индекс для поля, которое итак вроде бы упорядочено? Или я чего-то не понимаю?


Или!

ОБЯЗАТЕЛЬНО создайте индекс и посмотрите результат :-)Я, кстати, тоже не понимаю. Как минимум, не хватает информации о порядке полей в индексах.

И, если не ошибаюсь, оба LEFT JOIN-а фактически превращаются в просто JOIN-ы из-за `demand_type` = 'exchange'.
Если так и нужно, то лучше исправить JOIN-ы явно.
...
Рейтинг: 0 / 0
03.07.2014, 00:14:14
    #38686305
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnews,

это должно выглядеть так:

Код: plsql
1.
select if(NULL = 'dedicated', 'dedicated', 'newsletter')
...
Рейтинг: 0 / 0
03.07.2014, 01:10:01
    #38686321
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
javajdbc,

я извиняюсь за свою тупость. Индекс я создал но как я в этом запросе его могу применить подскажите, пожалуйста
...
Рейтинг: 0 / 0
03.07.2014, 01:14:18
    #38686324
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
alexnewsкак я в этом запросе его могу применить подскажите, пожалуйстаИндекс MySQL применит самостоятельно, если с его точки зрения это имеет смысл.
Проверьте время выполнения запроса еще несколько раз и покажите его новый план.
...
Рейтинг: 0 / 0
03.07.2014, 01:22:01
    #38686327
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
miksoft,

убрал LEFT, время не изменилось, да и везде пишут что от вида JOIN скорость не зависит или они не правы? Это интересно чисто для себя.
...
Рейтинг: 0 / 0
03.07.2014, 01:36:18
    #38686331
alexnews
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
можно ли с оптимизировать этот запрос?
miksoft,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
+----+-------------+------------+--------+---------------------------+---------------------------+---------+-------------------+---------+---------------------------------+
| id | select_type | table      | type   | possible_keys             | key                       | key_len | ref               | rows    | Extra                           |
+----+-------------+------------+--------+---------------------------+---------------------------+---------+-------------------+---------+---------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL                      | NULL                      | NULL    | NULL              | 9955416 | Using temporary; Using filesort |
|  2 | DERIVED     | d          | ALL    | NULL                      | NULL                      | NULL    | NULL              | 9955416 |                                 |
|  2 | DERIVED     | s          | ref    | idx_strategies_userver_id | idx_strategies_userver_id | 4       | lfx.d.LineItemID  |       1 |                                 |
|  2 | DERIVED     | c          | eq_ref | PRIMARY                   | PRIMARY                   | 96      | lfx.s.campaign_id |       1 | Using where                     |
+----+-------------+------------+--------+---------------------------+---------------------------+---------+-------------------+---------+---------------------------------+
4 rows in set, 65535 warnings (3 min 49.40 sec)



я вот не пойму где тут применяется мои индекс который я создал командой
Код: plsql
1.
create index index_daily_stat_by_day ON daily_stats(day);
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / можно ли с оптимизировать этот запрос? / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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