Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




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 - 11:19:07
Subject:оптимизация запроса
-----------------
Так... создаём модельную таблицу. Только заменяем имя поля, чтобы не использовать зарезервированного слова:

mysql> CREATE TABLE pages (
-> v_id INT
-> , dt DATETIME
-> , page TEXT
-> );
Query OK, 0 rows affected (0.43 sec)

Наполняем тестовыми данными:

mysql> INSERT INTO pages (v_id, dt, page)
-> SELECT 1, '2014-01-01 10:00:00', 'page1' UNION ALL
-> SELECT 1, '2014-01-01 10:10:00', 'page2' UNION ALL
-> SELECT 2, '2014-01-01 10:00:00', 'page1' UNION ALL
-> SELECT 2, '2014-01-01 10:10:00', 'page1' UNION ALL
-> SELECT 2, '2014-01-01 10:20:00', 'page3' UNION ALL
-> SELECT 3, '2014-01-01 10:00:00', 'page1' UNION ALL
-> SELECT 1, '2014-01-02 10:00:00', 'page1' UNION ALL
-> SELECT 1, '2014-01-02 10:10:00', 'page1' UNION ALL
-> SELECT 2, '2014-01-02 10:00:00', 'page1' UNION ALL
-> SELECT 2, '2014-01-02 10:10:00', 'page2' UNION ALL
-> SELECT 2, '2014-01-02 10:20:00', 'page3' UNION ALL
-> SELECT 3, '2014-01-02 10:00:00', 'page1' UNION ALL
-> SELECT 1, '2014-01-03 10:00:00', 'page1' UNION ALL
-> SELECT 1, '2014-01-04 10:00:00', 'page1' UNION ALL
-> SELECT 1, '2014-01-04 10:00:00', 'page1' ;
Query OK, 15 rows affected (0.09 sec)
Records: 15 Duplicates: 0 Warnings: 0

Проверяем их:

mysql> SELECT * FROM pages;
+------+---------------------+-------+
| v_id | dt | page |
+------+---------------------+-------+
| 1 | 2014-01-01 10:00:00 | page1 |
| 1 | 2014-01-01 10:10:00 | page2 |
| 2 | 2014-01-01 10:00:00 | page1 |
| 2 | 2014-01-01 10:10:00 | page1 |
| 2 | 2014-01-01 10:20:00 | page3 |
| 3 | 2014-01-01 10:00:00 | page1 |
| 1 | 2014-01-02 10:00:00 | page1 |
| 1 | 2014-01-02 10:10:00 | page1 |
| 2 | 2014-01-02 10:00:00 | page1 |
| 2 | 2014-01-02 10:10:00 | page2 |
| 2 | 2014-01-02 10:20:00 | page3 |
| 3 | 2014-01-02 10:00:00 | page1 |
| 1 | 2014-01-03 10:00:00 | page1 |
| 1 | 2014-01-04 10:00:00 | page1 |
| 1 | 2014-01-04 10:00:00 | page1 |
+------+---------------------+-------+
15 rows in set (0.00 sec)

Анализаруем.
2014-01-01. Три юзера. Первый зашёл дважды, второй трижды, третий один раз. Всего заходов 6, людей трое, повторно заходили двое.
2014-01-02. Всего заходов - 6, людей - 3, повторно заходили - 2.
2014-01-03. Всего заходов - 2, людей - 1, повторно заходили - 1.
2014-01-04. Всего заходов - 1, людей - 1, повторно заходили - 0.

Запускаем твой запрос, подкорректировав имена полей.

mysql> SELECT DATE(a.dt), COUNT(DISTINCT a.v_id), COUNT(a.v_id) FROM pages a WHERE DATE(a.dt) > (SELECT DATE(b.dt) FROM pages b WHERE b.v_id = a.v_id LIMIT 1) G
ROUP BY 1;
+------------+------------------------+---------------+
| DATE(a.dt) | COUNT(DISTINCT a.v_id) | COUNT(a.v_id) |
+------------+------------------------+---------------+
| 2014-01-02 | 3 | 6 |
| 2014-01-03 | 1 | 1 |
| 2014-01-04 | 1 | 2 |
+------------+------------------------+---------------+
3 rows in set (0.00 sec)

Если это "именно то, что надо", то трахайся дальше сам. Мой интеллект этого переварить не смог.



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
43016



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |