Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 25 сообщений из 42, страница 1 из 2
27.03.2015, 09:10:33
    #38918407
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Есть sql-запрос:

Код: plsql
1.
2.
3.
4.
5.
SELECT `t1`.`uid`, `t1`.`created_at`, `t2`.`count` AS `count` FROM `stats` `t1` 
INNER JOIN (SELECT `uid`, `created_at`, COUNT(uid) AS `count` FROM `stats` GROUP BY `uid`) `t2` ON t1.uid = t2.uid 
WHERE ((`t1`.`uid` NOT IN (9421802727)) AND (`t1`.`ip` NOT IN (3579284812))) 
AND (`t2`.`created_at` BETWEEN 't2.created_at' AND DATE_ADD(t1.created_at, INTERVAL -21 DAY)) 
GROUP BY `t1`.`uid` ORDER BY `count` DESC LIMIT 10



Суть в чем, нужно выбрать только те uid которые заходили на сайт в течение 21 дня и более. Все в принципе выбирается и работает, но запрос выполняется примерно пол секунды(что долго, ибо на странице до десятка подобных запросов с разными датами и условиями).

Ребят, как смог, так и оптимизировал, но чувствую, что можно как то еще. Не слишком силен в БД поэтому пишу здесь.

p.s. на ip и uid в таблице стоят индексы.
...
Рейтинг: 0 / 0
27.03.2015, 09:20:40
    #38918422
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
если хотите помощи в оптимизации, то необходимо выложить
SHOW CREATE TABLE (DDL) всех участвующих таблиц,
EXPLAIN запроса
и тд и тп
...
Рейтинг: 0 / 0
27.03.2015, 09:37:27
    #38918444
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
aramanuid которые заходили на сайт в течение 21 дня и более
Поясните эту фразу - её можно интерпретировать минимум тремя разными способами.
...
Рейтинг: 0 / 0
27.03.2015, 09:37:37
    #38918445
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Прикладываю файлы и схему:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE IF NOT EXISTS `stats` (
  `id` int(10) unsigned NOT NULL,
  `uid` bigint(20) unsigned NOT NULL COMMENT 'UID',
  `title` varchar(255) DEFAULT NULL COMMENT 'Заголовок',
  `url` text NOT NULL COMMENT 'Урл',
  `domain` varchar(255) NOT NULL COMMENT 'домен',
  `referrer` text COMMENT 'Реферер',
  `domain_ref` varchar(255) NOT NULL COMMENT 'домен',
  `ip` bigint(20) NOT NULL COMMENT 'IP-адрес',
  `browser` varchar(255) DEFAULT NULL COMMENT 'Браузер',
  `lang` varchar(100) DEFAULT NULL COMMENT 'Язык браузера',
  `created_at` datetime DEFAULT NULL COMMENT 'Дата'
) ENGINE=InnoDB AUTO_INCREMENT=69540 DEFAULT CHARSET=utf8;
...
Рейтинг: 0 / 0
27.03.2015, 09:38:30
    #38918449
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Akinaaramanuid которые заходили на сайт в течение 21 дня и более
Поясните эту фразу - её можно интерпретировать минимум тремя разными способами.

Пользователь зашел сегодня, вчера и например 2 месяца спустя. А если он зашел только сегодня и вчера - его не нужно показывать.
...
Рейтинг: 0 / 0
27.03.2015, 09:41:55
    #38918454
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
То есть только те, кто заходил хотя бы один раз за последние 21 день, и хотя бы один раз ранее?
...
Рейтинг: 0 / 0
27.03.2015, 10:02:22
    #38918487
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
araman,

"заходили на сайт в течение 21 дня и более." - это как?
...
Рейтинг: 0 / 0
27.03.2015, 10:21:03
    #38918519
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
если `created_at` у вас дата посещения - то в подзапросе при Group By покажет произвольную дату (использовать либо MAX... либо...
...
Рейтинг: 0 / 0
27.03.2015, 10:32:28
    #38918543
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Akina хотя бы один раз ранее.
MasterZiv см. выше
Alex_Ustinov не понял, можно более подробно?
...
Рейтинг: 0 / 0
27.03.2015, 10:58:47
    #38918597
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
пример с данными и желаемым рез-том приведите, типа посещал тогда-то надо получить то-то
...
Рейтинг: 0 / 0
27.03.2015, 11:21:56
    #38918671
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Уточняю:
Интервал между первым и последним заходом пользователя от 21 дня.
Т.е. если пользователь заходил к примеру:
01.03.2015
15.03.2015
26..03.2015
он попадает в выборку.

А если:
10.03.2015
25.03.2015
тогда он не попадает.
...
Рейтинг: 0 / 0
27.03.2015, 11:26:25
    #38918685
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
aramanПользователь зашел сегодня, вчера и например 2 месяца спустя. А если он зашел только сегодня и вчера - его не нужно показывать.

Может быть "два месяца назад" ?
В общем, ты сначала с русским языком разберись, это -- средние классы школы.
...
Рейтинг: 0 / 0
27.03.2015, 11:28:22
    #38918691
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
araman,

ну так
Код: sql
1.
2.
3.
4.
5.
select uid
from the_table
where условия_отсечки (за месяц, кроме пользователей NN и т.п.)
group by 1
having datediff(max(created_at),min(created_at))>=21
...
Рейтинг: 0 / 0
27.03.2015, 11:32:36
    #38918707
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MasterZiv,

Для начала на Вы. Не может быть, читайте внимательно вопрос.
...
Рейтинг: 0 / 0
27.03.2015, 11:37:48
    #38918731
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
araman , ты сначала с логикой запроса разрерись (после русского языка, разумеется).

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT `t1`.`uid`, `t1`.`created_at`, `t2`.`count` AS `count` 
FROM `stats` `t1` 
INNER JOIN (SELECT `uid`, `created_at`, COUNT(uid) AS `count` FROM `stats` GROUP BY `uid`) `t2` ON t1.uid = t2.uid 
WHERE `t1`.`uid` NOT IN (9421802727) 
  AND `t1`.`ip` NOT IN (3579284812)
  AND `t2`.`created_at` BETWEEN 't2.created_at' AND DATE_ADD(t1.created_at, INTERVAL -21 DAY)
GROUP BY `t1`.`uid` 
ORDER BY `count` DESC LIMIT 10



Таблица stats сгруппированная дважды по одному и тому же условию, JOIN-иться сама с собой.
Вопрос -- зачем ?

Очевидно, что подзапрос можно просто выкинуть, и будет то же самое (тот же самый бред, ну да ладно -- всё равно тот же самый).

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT `t1`.`uid`, `t1`.`created_at`, COUNT(uid) AS `count`
FROM `stats` `t1` 
WHERE `t1`.`uid` NOT IN (9421802727) 
  AND `t1`.`ip` NOT IN (3579284812)
  AND `t2`.`created_at` BETWEEN 't2.created_at' AND DATE_ADD(t1.created_at, INTERVAL -21 DAY)
GROUP BY `t1`.`uid` 
ORDER BY `count` DESC LIMIT 10
...
Рейтинг: 0 / 0
27.03.2015, 11:38:58
    #38918735
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
tangliraraman,

ну так
Код: sql
1.
2.
3.
4.
5.
select uid
from the_table
where условия_отсечки (за месяц, кроме пользователей NN и т.п.)
group by 1
having datediff(max(created_at),min(created_at))>=21



А как вы кол-во будете считать в таком случае? Да и запрос выполняется тоже 0.5 секунды.
В моем примере он еще выдает общее кол-во заходов.
...
Рейтинг: 0 / 0
27.03.2015, 11:41:37
    #38918744
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MasterZiv,

Если выкинуть подзапрос то тогда не посчитать корректно кол-во заходов.
Согласен что бред само на себя джойнить, но иначе я не придумал, поэтому и обратился сюда.
...
Рейтинг: 0 / 0
27.03.2015, 11:42:36
    #38918749
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
авторСуть в чем, нужно выбрать только те uid которые заходили на сайт в течение 21 дня и более. Все в принципе выбирается и работает, но запрос выполняется примерно пол секунды(что долго, ибо на странице до десятка подобных запросов с разными датами и условиями).


Ну и могу естественно предложить самый простой и действенный способо оптимизации такой фигни -- предвычисление.
В момент захода пользователя на сайт нужно предварительно вычислять список этих самых пользователей. Естественно, в момент захода он корректируется только -- один пользователь выбывает из списка, другой -- добавляется.

Ну и естественно можно показывать прост произвольных N пользователей на странице -- последних, кто заходили, или просто тупо произвольно брать 10-20 -- всю эту веб-хрень всё равно никто никогда не проверяет и она 200 раз никому не нужна.
...
Рейтинг: 0 / 0
27.03.2015, 11:45:22
    #38918757
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MasterZiv,

Если вас не затруднит, прочтите еще раз сообщение 17439157
У меня такое ощущение что вы не до конца поняли задачу, а пытаетесь тут умничать и "тыкать".
Ничего лично ессно.
...
Рейтинг: 0 / 0
27.03.2015, 11:46:16
    #38918759
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
aramanУточняю:
Интервал между первым и последним заходом пользователя от 21 дня.
Т.е. если пользователь заходил к примеру:
01.03.2015
15.03.2015
26..03.2015
он попадает в выборку.

А если:
10.03.2015
25.03.2015
тогда он не попадает.

Чё тогда проще вообще? Храни в таблице пользователей дату первого захода пользователя (создания?) и последнего захода пользователя. И автоматом из этого можно вычислить признак, нужно ли его показывать.
...
Рейтинг: 0 / 0
27.03.2015, 11:47:02
    #38918761
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
aramanMasterZiv,

Если вас не затруднит, прочтите еще раз сообщение 17439157
У меня такое ощущение что вы не до конца поняли задачу, а пытаетесь тут умничать и "тыкать".
Ничего лично ессно.

Безусловно, я с трудом понимаю тот бред, который ты тут несёшь...
...
Рейтинг: 0 / 0
27.03.2015, 11:48:46
    #38918766
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
araman,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE IF NOT EXISTS `stats` (
  `id` int(10) unsigned NOT NULL,
  `uid` bigint(20) unsigned NOT NULL COMMENT 'UID',
  `title` varchar(255) DEFAULT NULL COMMENT 'Заголовок',
  `url` text NOT NULL COMMENT 'Урл',
  `domain` varchar(255) NOT NULL COMMENT 'домен',
  `referrer` text COMMENT 'Реферер',
  `domain_ref` varchar(255) NOT NULL COMMENT 'домен',
  `ip` bigint(20) NOT NULL COMMENT 'IP-адрес',
  `browser` varchar(255) DEFAULT NULL COMMENT 'Браузер',
  `lang` varchar(100) DEFAULT NULL COMMENT 'Язык браузера',
  `created_at` datetime DEFAULT NULL COMMENT 'Дата'
) ENGINE=InnoDB AUTO_INCREMENT=69540 DEFAULT CHARSET=utf8;



Где ключи или хотя бы один индекс ?
...
Рейтинг: 0 / 0
27.03.2015, 11:51:21
    #38918775
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MasterZiv,

Простите, а это что по вашему:
Код: sql
1.
AND (`t2`.`created_at` BETWEEN 't2.created_at' AND DATE_ADD(t1.created_at, INTERVAL -21 DAY)) 



только дайте конкретный ответ без холивара про бред и прочее. Либо научитесь вести конструктивный диалог, раз мой русский хромает с ваших слов.
...
Рейтинг: 0 / 0
27.03.2015, 11:51:58
    #38918778
araman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MasterZiv,

Как я вижу в 1 посте я про это упомянул.
...
Рейтинг: 0 / 0
27.03.2015, 11:55:03
    #38918790
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
aramanMasterZiv,

Как я вижу в 1 посте я про это упомянул.

Так надо не упоминать, а дать вывод

Код: sql
1.
show treate table



Индексы бывают разные, и то, что ты считаешь под "в таблице стоят индексы", может означать всё, что угодно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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