powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать такой запрос
25 сообщений из 27, страница 1 из 2
Можно ли оптимизировать такой запрос
    #39042088
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, есть запрос, все работает, но как обычно хотелось бы поскорее(т.к. похожих запросов на странице до 5). Сча время занимает от 400-500мс(по замерам дебагера yii2).

Есть ли возможность как то "ускорить" его выполнение? Ессно кидаю все в мемкеш, но когда кеш пуст - страница может загружаться до 5 секунд(дебаггер показывает как раз долгое исполнение скл запросов).

Собственно ближе к делу:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE `stats` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `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 'домен',
  `domain_id` int(10) DEFAULT NULL COMMENT 'ID домена',
  `referrer` text COMMENT 'Реферер',
  `domain_ref` varchar(255) NOT NULL COMMENT 'домен',
  `domain_ref_id` int(10) DEFAULT NULL COMMENT 'ID домена рефера',
  `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 'Дата',
  PRIMARY KEY (`id`),
  KEY `fk_stats_uid_idx` (`uid`),
  KEY `fk_stats_ip_idx` (`ip`),
  KEY `fk_stats_domain_ref_idx` (`domain_ref`),
  KEY `fk_stats_domain_idx` (`domain`),
  KEY `fk_stats_domain_id_index` (`domain_id`),
  KEY `fk_stats_domain_ref_id_index` (`domain_ref_id`)
) ENGINE=InnoDB AUTO_INCREMENT=271568 DEFAULT CHARSET=utf8



Сам "виновник"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
    COUNT(*)
FROM
    (SELECT 
        `stats`.`uid`,
            COUNT(uid) AS `count`,
            COUNT(DISTINCT domain_id) AS `count_domains`
    FROM
        `stats`
    WHERE
        (`stats`.`uid` NOT IN (9421802727 , 5487722167, 4473237845, 7226083698, 2238407807, 4771231133, 3568163855, 7567680618, 9039386283, 1980237969))
            AND (`stats`.`ip` NOT IN (3579284812 , 3003068090, 620875042, 3322362487))
    GROUP BY `stats`.`uid`) `c`
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042092
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикладываю explain
Код: sql
1.
2.
3.
4.
5.
6.
+----+-------------+-------+-------+----------------------------------+------------------+---------+------+--------+------------------------------+
| id | select_type | table | type  | possible_keys                    | key              | key_len | ref  | rows   | Extra                        |
+----+-------------+-------+-------+----------------------------------+------------------+---------+------+--------+------------------------------+
|  1 | PRIMARY     | NULL  | NULL  | NULL                             | NULL             | NULL    | NULL |   NULL | Select tables optimized away |
|  2 | DERIVED     | stats | index | fk_stats_uid_idx,fk_stats_ip_idx | fk_stats_uid_idx | 8       | NULL | 235101 | Using where                  |
+----+-------------+-------+-------+----------------------------------+------------------+---------+------+--------+------------------------------+
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042105
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
araman,

Показывайте план запроса.

Зачем поле `ip` имеет тип bigint? Для ipv4 достаточно int, а для ipv6 bigint мал.

Попробуйте создать индекс (uid, ip).
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042106
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, что то у меня в int не влезает, кодирую ip так:
Код: php
1.
return sprintf('%u', ip2long(trim($ip)));



План запроса, это что? :) Разве не эксплайн?
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042107
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Индекс попробовал - без изменений. По крайней мере время выполнения запроса не изменилось.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042110
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aramanНет, что то у меня в int не влезает, кодирую ip так:Точнее, это должен быть unsigned int.
aramanПлан запроса, это что? :) Разве не эксплайн?Да, он. Это я слишком долго свой пост писал. Отвлекают :)
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042111
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aramanИндекс попробовал - без изменений. По крайней мере время выполнения запроса не изменилось.Именно такой индекс (т.е. именно из этих полей и именно в таком порядке)? ANALYZE TABLE после этого делали? План изменился?
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042116
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE stats
(
    id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
    uid BIGINT UNSIGNED NOT NULL,
    title VARCHAR(255),
    url LONGTEXT NOT NULL,
    domain VARCHAR(255) NOT NULL,
    domain_id INT,
    referrer LONGTEXT,
    domain_ref VARCHAR(255) NOT NULL,
    domain_ref_id INT,
    ip BIGINT NOT NULL,
    browser VARCHAR(255),
    lang VARCHAR(100),
    created_at DATETIME
);
CREATE INDEX fk_stats_domain_id_index ON stats (domain_id);
CREATE INDEX fk_stats_domain_idx ON stats (domain);
CREATE INDEX fk_stats_domain_ref_id_index ON stats (domain_ref_id);
CREATE INDEX fk_stats_domain_ref_idx ON stats (domain_ref);
CREATE INDEX fk_stats_ip_idx ON stats (ip);
CREATE INDEX fk_stats_uid_idx ON stats (uid);
CREATE INDEX fk_stats_uid_to_ip_idx ON stats (uid, ip);



Сча вот так, да, сделал ANALYZE TABLE

Експлайн
Код: sql
1.
2.
3.
4.
5.
6.
+----+-------------+-------+-------+---------------------------------------------------------+------------------+---------+------+--------+------------------------------+
| id | select_type | table | type  | possible_keys                                           | key              | key_len | ref  | rows   | Extra                        |
+----+-------------+-------+-------+---------------------------------------------------------+------------------+---------+------+--------+------------------------------+
|  1 | PRIMARY     | NULL  | NULL  | NULL                                                    | NULL             | NULL    | NULL |   NULL | Select tables optimized away |
|  2 | DERIVED     | stats | index | fk_stats_uid_idx,fk_stats_ip_idx,fk_stats_uid_to_ip_idx | fk_stats_uid_idx | 8       | NULL | 240855 | Using where                  |
+----+-------------+-------+-------+---------------------------------------------------------+------------------+---------+------+--------+------------------------------+
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042120
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если запрос переписать так:
Код: sql
1.
2.
3.
4.
SELECT COUNT(DISTINCT uid)
FROM `stats`
WHERE `stats`.`uid` NOT IN (9421802727 , 5487722167, 4473237845, 7226083698, 2238407807, 4771231133, 3568163855, 7567680618, 9039386283, 1980237969)
AND `stats`.`ip` NOT IN (3579284812 , 3003068090, 620875042, 3322362487)

?

Еще можно попробовать индекс из тех же двух полей, но в обратном порядке.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042139
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал в обратном порядке - никакого прироста.
Запрос ваш работает быстро, но он немного отличен от изначального. Там у меня этот запрос в подзапросе стоит. Он отдельно тоже быстро отрабатывает. Проблема в каунте.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042144
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aramanЗапрос ваш работает быстро, но он немного отличен от изначального.Отличен, но результат должен выдавать тот же.
aramanТам у меня этот запрос в подзапросе стоит. Он отдельно тоже быстро отрабатывает. Проблема в каунте.Показывайте целиком. А то так гадать можно долго.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042149
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде бы фильтр NOT IN вынуждает применять FULL SCAN?
То есть индексы не получится задействовать.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042156
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разве что покрывающий индекс (uid, ip, domain_id)
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042159
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маленько код оптимизировал, сча выдается такое:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT 
    `stats`.`uid`,
    COUNT(uid) AS `count`,
    COUNT(DISTINCT domain_id) AS `count_domains`
FROM
    `stats`
WHERE
    (`stats`.`uid` NOT IN (9421802727 , 5487722167,
        4473237845,
        7226083698,
        2238407807,
        4771231133,
        3568163855,
        7567680618,
        9039386283,
        1980237969))
        AND (`stats`.`ip` NOT IN (3579284812 , 3003068090, 620875042, 3322362487))
GROUP BY `stats`.`uid`
ORDER BY `count` DESC
LIMIT 40
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042164
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
+----+-------------+-------+-------+----------------------------------+------------------+---------+------+--------+----------------------------------------------+
| id | select_type | table | type  | possible_keys                    | key              | key_len | ref  | rows   | Extra                                        |
+----+-------------+-------+-------+----------------------------------+------------------+---------+------+--------+----------------------------------------------+
|  1 | SIMPLE      | stats | index | fk_stats_uid_idx,fk_stats_ip_idx | fk_stats_uid_idx | 8       | NULL | 239517 | Using where; Using temporary; Using filesort |
+----+-------------+-------+-------+----------------------------------+------------------+---------+------+--------+----------------------------------------------+
1 row in set (0.00 sec)
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042172
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если проблема во внешнем COUNT(*) пробуйте хитрить

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT SUM(cnt.t)
(SELECT 
    1 as cnt,
    `stats`.`uid`,
    COUNT(uid) AS `count`,
    COUNT(DISTINCT domain_id) AS `count_domains`
FROM
    `stats`
...
) as t
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042177
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внешнего уже нет, я код подрефакторил актив рекорда. Сча выплевывает квери, что выше.
Честно говоря, разительно помогло - поставить для дата провайдера лимит например в 500 записей, тем самым запрос на подсчет строк игнорируется и страница грузится молниеносно. Наверно так и оставлю пока, в данном случае это решение прокатит ибо все записи выводить и не нужно, более 500 никто не будет смотреть.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042183
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но тем не менее, вопрос хотелось бы решить, ибо ставить тотал каунт - не решение вопроса.
Квери, что выше - как то можно еще куда то ускорить или уже предел?
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042225
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Разве что покрывающий индекс (uid, ip, domain_id)Да, точно. Я это же и хотел предложить, но поле domain_id упустил из виду, т.к. оно хоть и упоминается, но фактически не используется.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042292
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну оно нужно немного для других выборок.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042307
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aramanНу оно нужно немного для других выборок.Тогда другие выборки нужно оптимизировать отдельно.
Нельзя оптимизировать запросы вообще. Можно оптимизировать только конкретные запросы.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042467
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну я конкретный и написал, другие работают нормально.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042503
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aramanНу я конкретный и написал, другие работают нормально.Конкретный я показал как лучше переписать и, по вашим же словам, он работает быстро.
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042511
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Более менее "пригладил", стало побыстрее!
...
Рейтинг: 0 / 0
Можно ли оптимизировать такой запрос
    #39042512
araman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А еще вопрос по оффтопу, в консоли можно как то посмотреть время выполнения запроса? А то опираться на дебагер yii в плане тайминга как то не сильно хочется.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать такой запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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