|
MySQL.RU - Webboard
Вернуться
оптимизация запроса (Макс) 16/01/2014 - 16:40:26
Re: оптимизация запроса (Akina) 16/01/2014 - 17:17:17
Re: оптимизация запроса (Макс) 17/01/2014 - 09:02:43
Re: оптимизация запроса (Akina) 17/01/2014 - 11:19:07
Re: оптимизация запроса (Макс) 17/01/2014 - 12:06:33
Re: оптимизация запроса (1) (Akina) 17/01/2014 - 12:40:18
Re: оптимизация запроса (2) (Akina) 17/01/2014 - 12:51:01
Re: оптимизация запроса (3) (Akina) 17/01/2014 - 12:55:42
Re: оптимизация запроса (3) (Макс) 17/01/2014 - 13:05:14
Re: оптимизация запроса (4) (Akina) 17/01/2014 - 13:08:51
Re: оптимизация запроса (4) (Макс) 17/01/2014 - 13:21:49
Re: недоработка mysql (Akina) 17/01/2014 - 13:59:51
Re: недоработка mysql (Макс) 17/01/2014 - 14:24:00
Re: недоработка mysql (Akina) 17/01/2014 - 14:59:43
Re: недоработка mysql (Макс) 17/01/2014 - 15:28:10
> Original message text:
> From: Макс - 16/01/2014 - 16:40:26
> Subject:оптимизация запроса
> -----------------
> Здравия! Подскажите чайнику, пжалста - можно ли ускорить?
>
> Осознаю, что занимаюсь извращением, просто для саморазвития :)
> Есть таблица посещенных страниц - кто(v_id), когда(datetime), какую страницу(page).
> Нужны данные - сколько людей зашли на сайт повторно (по дням).
>
> Наваял такое:
> SELECT DATE(a.datetime), COUNT(DISTINCT a.v_id), COUNT(a.v_id) FROM pages a WHERE DATE(a.datetime) > (SELECT DATE(b.datetime) FROM pages b WHERE b.v_id = a.v_id LIMIT 1) GROUP BY 1;
>
> Для ускорения добавил составной индекс (v_id,datetime).
> Получил:
> +----+--------------------+-------+-------+---------------+----------+---------+---------------+--------+------------------------------------------+
> | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
> +----+--------------------+-------+-------+---------------+----------+---------+---------------+--------+------------------------------------------+
> | 1 | PRIMARY | a | index | NULL | vid_date | 106 | NULL | 132212 | Using where; Using index; Using filesort |
> | 2 | DEPENDENT SUBQUERY | b | ref | vid_date | vid_date | 98 | online.a.v_id | 3 | Using index |
> +----+--------------------+-------+-------+---------------+----------+---------+---------------+--------+------------------------------------------+
>
> Время (130тыщ записей в таблице):
> 72 rows in set (0.60 sec)
>
>
From: Akina - 17/01/2014 - 13:08:51
Subject:оптимизация запроса (4)
-----------------
Нет, а почему filesort? почему не используется индекс? ааа! так мы же группируем не по полю, а по выражению!!!
А что если мы попробуем заставить группировать по полю. Что для этого нужно? вренмя-то хранить надо... а нужно просто ввести дополнительное поле и заполнить его чисто датой, без времени. Давай попробуем... создадим поле, заполним его значениями, создадим дополнителдьные индексы с этим полем и посмотрим... я смотреть буду на запросе с декартовым произведением и отбором, мне он больше всех нравится, самый понятный.
mysql> ALTER TABLE pages ADD COLUMN d DATE;
Query OK, 0 rows affected (0.52 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> UPDATE pages SET d = DATE(dt);
Query OK, 15 rows affected (0.04 sec)
Rows matched: 15 Changed: 15 Warnings: 0
mysql> CREATE INDEX d_v_id ON pages(d,v_id);
Query OK, 0 rows affected (0.43 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> CREATE INDEX v_id_d ON pages(v_id,d);
Query OK, 0 rows affected (0.48 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> CREATE INDEX d_v_id_dt ON pages(d,v_id,dt);
Query OK, 0 rows affected (0.56 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain
-> SELECT a.d, COUNT(DISTINCT a.v_id), COUNT(DISTINCT a.v_id, a.dt)
-> FROM pages a, pages b
-> WHERE b.v_id = a.v_id AND a.d > b.d
-> GROUP BY 1;
+----+-------------+-------+-------+--------------------------------------+--------+---------+-------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+--------------------------------------+--------+---------+-------------+------+--------------------------+
| 1 | SIMPLE | a | index | v_id,v_id_dt,d_v_id,v_id_d,d_v_id_dt | d_v_id | 9 | NULL | 15 | Using where |
| 1 | SIMPLE | b | ref | v_id,v_id_dt,d_v_id,v_id_d,d_v_id_dt | v_id_d | 5 | test.a.v_id | 2 | Using where; Using index |
+----+-------------+-------+-------+--------------------------------------+--------+---------+-------------+------+--------------------------+
2 rows in set (0.00 sec)
Вот и нету файлосорта...
Ну а прогнать через это дело остальные варианты и решить, какой запрос оптимален и какие индексы надо оставить, ты сможешь и сам. Ведь сможешь?
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
43016
|
|