powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
25 сообщений из 42, страница 1 из 2
Помогите оптимизировать запрос
    #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
Помогите оптимизировать запрос
    #38918422
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хотите помощи в оптимизации, то необходимо выложить
SHOW CREATE TABLE (DDL) всех участвующих таблиц,
EXPLAIN запроса
и тд и тп
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #38918444
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aramanuid которые заходили на сайт в течение 21 дня и более
Поясните эту фразу - её можно интерпретировать минимум тремя разными способами.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #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
Помогите оптимизировать запрос
    #38918449
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaaramanuid которые заходили на сайт в течение 21 дня и более
Поясните эту фразу - её можно интерпретировать минимум тремя разными способами.

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

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

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

Может быть "два месяца назад" ?
В общем, ты сначала с русским языком разберись, это -- средние классы школы.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #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
Помогите оптимизировать запрос
    #38918707
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Для начала на Вы. Не может быть, читайте внимательно вопрос.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #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
Помогите оптимизировать запрос
    #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
Помогите оптимизировать запрос
    #38918744
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

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


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

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

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

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

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

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

Безусловно, я с трудом понимаю тот бред, который ты тут несёшь...
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #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
Помогите оптимизировать запрос
    #38918775
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

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



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

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

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

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

Код: sql
1.
show treate table



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


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