Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долгий простой запрос из небольшого количества записей. / 13 сообщений из 13, страница 1 из 1
06.05.2019, 17:41
    #39810340
VladRost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
Добрый день!
Странная проблема - достаточно простой запрос:
SELECT
k.id kid, k.ip kip, k.time ktim, k.name knam, k.url kurl, k.ocenka koc, k.text ktex, s.zagol szag, k.server kserv
FROM
nstat25 k, nstat15 s
WHERE
k.url = s.url AND k.server = s.server AND k.mask='y'
ORDER BY k.time
DESC
LIMIT 0, 10

т.е. из 2-х таблиц, в каждой менее 4000 записей, но запрос выполняется 3 секунды.

Прочитал несколько похожих тем, но не очень понял, как решить проблему.
Может в запросе я что-то делаю не так? Но ведь мелкие таблицы.
...
Рейтинг: 0 / 0
06.05.2019, 17:47
    #39810342
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
Покажите DDL таблиц и план запроса.
...
Рейтинг: 0 / 0
06.05.2019, 21:44
    #39810426
VladRost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
id select_type table partitions type possible_keys key key_len ref rows filtered Extra1 SIMPLE s NULL ALL NULL NULL NULL NULL 3342 100.00 Using temporary; Using filesort1 SIMPLE k NULL ALL NULL NULL NULL NULL 3840 0.10 Using where; Using join buffer (Block Nested Loop)

Что такое DDL не знаю :(
...
Рейтинг: 0 / 0
06.05.2019, 21:58
    #39810429
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
VladRostЧто такое DDL не знаю :( SHOW CREATE TABLE tbl_name
...
Рейтинг: 0 / 0
06.05.2019, 22:02
    #39810430
VladRost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
Таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table nstat25 (
    id int not null auto_increment,
    ip varchar (15),
    time int(10) ,
    unik varchar (25),
    email varchar (255),
    agent varchar (255),
    language varchar (10),
    name varchar (30),
    server varchar (100),
    url varchar (255),
    mask char (2) default 'y',	
    ocenka int (1),
    text text,
        primary  key (id)   )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table nstat15 (
    id int not null auto_increment,
    first int(10) ,
    last int(10) ,
    zagol varchar (255),
    server varchar (100),
    url varchar (255),
    vsoc int (10) default 0,
    sroc int (10) default 0,
    vccom int (10) default 0,
    vsego int (10) default 1,	
    mask char (2) default 'y',
        primary  key (id)   )
...
Рейтинг: 0 / 0
06.05.2019, 22:10
    #39810432
VladRost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
nstat15
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE `nstat15` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first` int(10) DEFAULT NULL,
  `last` int(10) DEFAULT NULL,
  `zagol` varchar(255) DEFAULT NULL,
  `server` varchar(100) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `vsoc` int(10) DEFAULT '0',
  `sroc` int(10) DEFAULT '0',
  `vccom` int(10) DEFAULT '0',
  `vsego` int(10) DEFAULT '1',
  `mask` char(2) DEFAULT 'y',
  `obr` int(100) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3358 DEFAULT CHARSET=utf8


nstat25
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE `nstat25` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip` varchar(15) DEFAULT NULL,
  `time` int(10) DEFAULT NULL,
  `unik` varchar(25) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `agent` varchar(255) DEFAULT NULL,
  `language` varchar(10) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL,
  `server` varchar(100) DEFAULT NULL,
  `url` varchar(255) DEFAULT NULL,
  `mask` char(2) DEFAULT 'y',
  `ocenka` int(1) DEFAULT NULL,
  `text` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3907 DEFAULT CHARSET=utf8
...
Рейтинг: 0 / 0
06.05.2019, 22:12
    #39810433
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
s.url, s.server - какое-то из этих двух полей надо проиндексировать, или даже оба - зависит от их селективности.

Существует ли гарантия, что для каждой записи из таблицы nstat25 найдется хотя бы одна запись в таблице nstat15 ?
...
Рейтинг: 0 / 0
06.05.2019, 22:59
    #39810446
VladRost
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
miksofts.url, s.server - какое-то из этих двух полей надо проиндексировать, или даже оба - зависит от их селективности.


Но ведь маленькие таблицы же. Без индексирования никак?

miksoftСуществует ли гарантия, что для каждой записи из таблицы nstat25 найдется хотя бы одна запись в таблице nstat15 ?

По идее да - соответствие должно быть.
В принципе server + url в nstat15 - уникальное сочетание, можно в nstat25 вместо них использовать ссылку на ID из nstat15.
Так будет быстрее?
...
Рейтинг: 0 / 0
07.05.2019, 00:16
    #39810460
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
VladRostНо ведь маленькие таблицы же. Без индексирования никак?Сравните 4000*4000 и 4000*log 2 4000
Примерно в 300 раз разница.
Другими способами добиться такой разницы если и возможно, то крайне затратно.
...
Рейтинг: 0 / 0
07.05.2019, 00:18
    #39810461
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
VladRostПо идее да - соответствие должно быть."По идее" тут не годится - нужна гарантия. Если гарантия есть, то можно отбор записей по ORDER BY k.time DESC LIMIT 0, 10 выполнить до джойна и тогда вместо 4000 записей из первой таблицы в джойн пойдет только 10 - 400 раз разницы.
...
Рейтинг: 0 / 0
07.05.2019, 00:19
    #39810462
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
VladRostможно в nstat25 вместо них использовать ссылку на ID из nstat15.Сравнение одного числового поля, конечно, будет быстрее, чем двух строковых.
...
Рейтинг: 0 / 0
07.05.2019, 07:38
    #39810500
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
Нормализуйте данные. Связывание по VARCHAR сродни бреду.
...
Рейтинг: 0 / 0
07.05.2019, 10:26
    #39810572
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгий простой запрос из небольшого количества записей.
VladRostid select_type table partitions type possible_keys key key_len ref rows filtered Extra1 SIMPLE s NULL ALL NULL NULL NULL NULL 3342 100.00 Using temporary; Using filesort1 SIMPLE k NULL ALL NULL NULL NULL NULL 3840 0.10 Using where; Using join buffer (Block Nested Loop)

феерично
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Долгий простой запрос из небольшого количества записей. / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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