powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортировка после distinct SUBSTRING_INDEX(...)
25 сообщений из 31, страница 1 из 2
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124531
Имеется стандартная база Syslog
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE IF NOT EXISTS `SystemEvents` (
  `ID` int(10) unsigned NOT NULL,
  `CustomerID` bigint(20) DEFAULT NULL,
  `ReceivedAt` datetime DEFAULT NULL,
  `DeviceReportedTime` datetime DEFAULT NULL,
  `Facility` smallint(6) DEFAULT NULL,
  `Priority` smallint(6) DEFAULT NULL,
  `FromHost` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Message` text COLLATE utf8_unicode_ci,
  `NTSeverity` int(11) DEFAULT NULL,
  `Importance` int(11) DEFAULT NULL,
  `EventSource` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `EventUser` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `EventCategory` int(11) DEFAULT NULL,
  `EventID` int(11) DEFAULT NULL,
  `EventBinaryData` text COLLATE utf8_unicode_ci,
  `MaxAvailable` int(11) DEFAULT NULL,
  `CurrUsage` int(11) DEFAULT NULL,
  `MinUsage` int(11) DEFAULT NULL,
  `MaxUsage` int(11) DEFAULT NULL,
  `InfoUnitID` int(11) DEFAULT NULL,
  `SysLogTag` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `EventLogType` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `GenericFileName` varchar(60) COLLATE utf8_unicode_ci DEFAULT NULL,
  `SystemID` int(11) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=419356 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;



В SysLogTag много всего но в основном 'web-proxy,account'
В Message приблизительно ' 192.168.127.23 GET http://i47.fastpic.ru/big/2013/0504/4b/c7d17bcb8543bd367cdd17416ce8424b.gif action=allow cache=MISS'

Выборка из 400000+ строк (61 всего, Запрос занял 0.0538 сек.) Терпимо
Код: sql
1.
2.
3.
4.
5.
SELECT distinct SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
ORDER BY ip


Но когда пытаюсь сортировать все плохо (61 всего, Запрос занял 3.4549 сек.)
Код: sql
1.
ORDER BY ip ASC
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124540
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай Жуков,

Показывайте точные запросы и их планы.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124543
miksoft,
это и есть точный запрос
Без сортировки
Код: sql
1.
2.
3.
4.
SELECT distinct SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0


С сортировкой
Код: sql
1.
2.
3.
4.
5.
SELECT distinct SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
ORDER BY ip ASC


первый 0.0538 сек. второй 3.4549 сек.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124545
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И планы запросов, пожалуйста.

Попутно попробуйте такие варианты:
Код: sql
1.
2.
3.
4.
5.
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
GROUP BY ip ASC

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT ip FROM (
SELECT distinct SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
) t
ORDER BY ip ASC
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124546
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай Жуковпервый 0.0538 секА это точно результат не из кэша? добавьте слово SQL_NO_CACHE сразу после слова SELECT, чтобы кэш запросов не влиял.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124547
EXTPLAN



без сортировки

select_type:SIMPLE
Table:se
Type:ALL
possible_keys:NULL
key:NULL
key_len:NULL
ref:NULL
rows:400635
Extra:Using where; Using temporary

с сортировкой
Extra:Using where; Using temporary; Using filesort
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124548
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай Жуков
Код: sql
1.
se.SysLogTag='web-proxy,account'

Для какой доли записей выполняется это условие?
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124549
Код: sql
1.
2.
3.
4.
SELECT SQL_NO_CACHE distinct SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0


61 всего, Запрос занял 0.0560 сек.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124552
miksoftНиколай Жуков
Код: sql
1.
se.SysLogTag='web-proxy,account'

Для какой доли записей выполняется это условие?
Сейчас 70% планируется 90-98%

miksoftПопутно попробуйте такие варианты:
(61 всего, Запрос занял 3.3338 сек.) для GROUP
3.56 ORDER
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124554
miksoftНиколай Жуков
Код: sql
1.
se.SysLogTag='web-proxy,account'

Для какой доли записей выполняется это условие?

Исправляюсь 400635 из 419356 как раз уже 96-98%
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39124563
Заметил что
Код: sql
1.
2.
3.
4.
5.
SELECT distinct @ip:=INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1)) AS ip,INET_NTOA(@ip) AS ip2
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
ORDER BY ip ASC


работает быстрее но не значительно 3.1-3.2 сек.
А без сортировки вообще летает (61 всего, Запрос занял 0.0484 сек.)
Также сортировка без повторной распаковки IP в два раза быстрее (61 всего, Запрос занял 1.7083 сек.)
Код: sql
1.
2.
3.
4.
5.
SELECT distinct @ip:=INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1)) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
ORDER BY ip ASC
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39125745
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай Жуковmiksoftпропущено...
Для какой доли записей выполняется это условие?

Исправляюсь 400635 из 419356 как раз уже 96-98%т.е. 400 тысяч записей, но из них условию INET_ATON(...)>0 удовлетворяют только 61?
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39125788
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirт.е. 400 тысяч записей, но из них условию INET_ATON(...)>0 удовлетворяют только 61?Это же после distinct-а. Т.е. они сильно повторяются.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39125828
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksofttanglirт.е. 400 тысяч записей, но из них условию INET_ATON(...)>0 удовлетворяют только 61?Это же после distinct-а. Т.е. они сильно повторяются.Упустил этот момент. Если целых три секунды, то наверное да, повторяются. Ну тут кроме выделения этого INET_ATON(...) в отдельное индексированное поле вариантов, наверное, и нет.
Хотя... ТС так и не ответил, сколько работает этот запрос
miksoft
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT ip FROM (
SELECT distinct SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
) t
ORDER BY ip ASC
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39125836
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirХотя... ТС так и не ответил, сколько работает этот запросНасколько я понял, ответил тут - 18538268 в последней строке поста.

Меня вот смущает ситуация, когда 61 запись "добывается" довольно быстро (хотя перелопатить нужно много), а их же отсортировать - долго (хотя объем копеечный).
Не первый раз вижу такой "заскок" у MySQL, но как лечить - не знаю. До сих пор если и удавалось, только только вариациями запроса. Или вообще записать в промежуточную таблицу и читать с сортировкой из нее.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39133185
Извиняюсь за пробел во времени, в командировке был.
Попытаюсь ответить на все что пропустил.

База уже 968k записей.
Строка с которой производятся манипуляции ( 192.168.127.23 GET http://i47.fastpic.ru/big/2013/0504/4b/c7d17bcb8543bd367cdd17416ce8424b.gif action=allow cache=MISS)

Запрос без сортировки. Всего отвечающий требованию строк после DISTINCT (80 всего, Запрос занял 0.0495 сек.)
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT @tmp:=INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1)) AS tmp,
	INET_NTOA(@tmp) AS ip
FROM SystemEvents AS se 
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0



Я так понимаю что ORDER с начало сортирует 970k записей а потом делает DISTINCT
Иначе объяснить что аналогичный запрос с сортировкой (80 всего, Запрос занял 6.8354 сек.)
Код: sql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT @tmp:=INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1)) AS tmp,
	INET_NTOA(@tmp) AS ip
FROM SystemEvents AS se 
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
ORDER BY @tmp DESC



(80 всего, Запрос занял 8.4260 сек.)
miksoft
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT ip FROM (
SELECT distinct SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
) t
ORDER BY ip ASC



miksoftНасколько я понял, ответил тут - 18538268 в последней строке поста.
Прирост в скорости между DISTINCT+ORDER и GROUP я бы списал на временную загрузку железа

И если можно то по подробнее вот об этом
miksoftИли вообще записать в промежуточную таблицу и читать с сортировкой из нее.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39133302
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай ЖуковИ если можно то по подробнее вот об этом
miksoftИли вообще записать в промежуточную таблицу и читать с сортировкой из нее.Да прям буквально и сделать - создать табличку, заполнить ее запросом без сортировки из начала топика (который выполняется 0.0538 сек.), а потом сделать выборку из этой таблички с сортировкой.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39133546
miksoftНиколай ЖуковИ если можно то по подробнее вот об этом
пропущено...
Да прям буквально и сделать - создать табличку, заполнить ее запросом без сортировки из начала топика (который выполняется 0.0538 сек.), а потом сделать выборку из этой таблички с сортировкой.


Создал таблицу
Код: sql
1.
2.
3.
CREATE TABLE IF NOT EXISTS `_sort` (
  `ip` varchar(40) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


Добавлено 80 строк. (Запрос занял 8.9161 сек.)
Код: sql
1.
2.
3.
4.
5.
INSERT INTO _sort (`ip`)
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se 
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0



Результат для запроса без INSERT(80 всего, Запрос занял 0.0511 сек.)
Код: sql
1.
2.
3.
4.
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se 
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39133570
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай ЖуковДобавлено 80 строк. (Запрос занял 8.9161 сек.)А если очистить табличку и повторить?
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39133598
miksoft,
Это сразу после очистки
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39133608
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай Жуковmiksoft,
Это сразу после очисткиСуть не в очистке, а в повторе запроса.
Не понимаю, куда там могут 8 секунд потратиться.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39133752
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай Жуков,

а если табличку сделать engine=memory? ну так, в порядке бреда.
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39134137
tanglirНиколай Жуков,

а если табличку сделать engine=memory? ну так, в порядке бреда.

Готов проверить любой бред
Знать бы как
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39134156
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николай ЖуковЗнать бы как
Код: sql
1.
2.
3.
CREATE TABLE IF NOT EXISTS `_sort` (
  `ip` varchar(40) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
...
Рейтинг: 0 / 0
Сортировка после distinct SUBSTRING_INDEX(...)
    #39134262
tanglirНиколай ЖуковЗнать бы как
Код: sql
1.
2.
3.
CREATE TABLE IF NOT EXISTS `_sort` (
  `ip` varchar(40) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;



Честно в полном недоумении
(Запрос занял 0.0049 сек.)
Код: sql
1.
2.
3.
CREATE TABLE IF NOT EXISTS `_sort` (
  `ip` varchar(40) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


Добавлено 80 строк. (Запрос занял 9.0948 сек.)
Код: sql
1.
2.
3.
4.
5.
INSERT INTO _sort (`ip`) 
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se 
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0


Сам запрос (80 всего, Запрос занял 0.0561 сек.)
Код: sql
1.
2.
3.
4.
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1) AS ip
FROM SystemEvents AS se 
WHERE se.SysLogTag='web-proxy,account' AND 
	INET_ATON(SUBSTRING_INDEX(SUBSTRING_INDEX(se.Message,' ',2),' ',-1))>0
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортировка после distinct SUBSTRING_INDEX(...)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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