powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / оптимизация between : where 'const' between f1 and f2
25 сообщений из 30, страница 1 из 2
оптимизация between : where 'const' between f1 and f2
    #38716003
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собственно интересует вопрос. как лучше всего строить таблицу и поиск, если
в таблице каждая запись хранит диапазон - поля нач.диапазона и конец.диапазона
и нам по заданной величине надо найти в какие диапазоны оно попадает.

впервые сталкиваюсь, и нагуглить не выходит, постоянно попадаю на обычную ситуацию, найти строки, где ключ попал в заданый диапазон.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716072
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716094
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

:) спасибо. я подумал про геометрические фигуры...но я так понимаю что тамошние индексы это не тоже самое что по числу.... то есть может есть более рациональное решение для числовых интервалов, чем строить на интервал 10-20 скажем линию 10 0 -20 0 и потом искать точку 15 0.

зыбал уточнить, что вариант с линиями я обудмывал
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716100
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще зависит от конкретики. Распределение данных, выбираемые поля и т.п.
Возможно, и простой индекс из двух полей пойдет.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716185
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453то есть может есть более рациональное решение для числовых интервалов, чем строить на интервал 10-20 скажем линию 10 0 -20 0 и потом искать точку 15 0.в мускле точно нет
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716194
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
специфика задачи - геолокация по айпи, есть таблица с интервалами айпиадресов(большие целые числа) - и вот надо её джоинить к выборкам из логовохранилищ, где указан айпишник
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716202
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453специфика задачи - геолокация по айпи, есть таблица с интервалами айпиадресов(большие целые числа) - и вот надо её джоинить к выборкам из логовохранилищ, где указан айпишник 9308178
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716203
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

"точка входит в отрезок"
что в мускле для этого есть? лучше, чем ртри? я не знаю.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716219
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453,

"точка входит в отрезок"
что в мускле для этого есть? лучше, чем ртри? я не знаю.

можешь подробней...почему все делают акцент на ртрии, а у меня мускл выдаёт что текущая версия не поддерживает спаршил ртри индекс
-версия 5.6.16-64.2-569.precise

и сделал как в факе

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `geo_ips` (
	`idgeo_ip` INT(11) NOT NULL,
	`iprange` LINESTRING NOT NULL,
	PRIMARY KEY (`idgeo_ip`),
	SPATIAL INDEX `AK_iprange` (`iprange`)
)

explain 
select * from geo_ips
where MBRCONTAINS(iprange,POINT(1580060873,0));



Код: plaintext
1.
2.
3.
"id"	"select_type"	"table"	"type"	"possible_keys"	"key"	"key_len"	"ref"	"rows"	"Extra"
"1"	"SIMPLE"	"geo_ips"	"ALL"	"AK_iprange"	\N	\N	\N	"1986196"	"Using where"

...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716226
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лично я уже начинаю думать, может сделать таблицу свою диапазонов айпи по типу...

первые три байта айпишника - мин макс четвёртого

и тогда у меня получиться индекс на трибайта эти, по ним искать, а там уже сколько строк будет - а это несколько , найдёт нужный.

а то вариант из фака, мол найти все гле левая граница меньше равно заданому, сортируя по левой границе лимит 1(для случая не пересекающихся диапазонов) тоже не катит - из почти 2 лямов строк почти лям простатриваеться...

Код: sql
1.
2.
3.
select * from geo_ips
where `start`<= :ip
order by `start` limit 1;


половину таблицы сканирует.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716230
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453а то вариант из фака, мол найти все гле левая граница меньше равно заданому, сортируя по левой границе лимит 1(для случая не пересекающихся диапазонов) тоже не катит - из почти 2 лямов строк почти лям простатриваеться...

Код: sql
1.
2.
3.
select * from geo_ips
where `start`<= :ip
order by `start` limit 1;



половину таблицы сканирует.Скорее всего вы что-то не так делаете. Показывайте DDL таблицы, точный запрос, его план и прочие подробности.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716249
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftalex564657498765453а то вариант из фака, мол найти все гле левая граница меньше равно заданому, сортируя по левой границе лимит 1(для случая не пересекающихся диапазонов) тоже не катит - из почти 2 лямов строк почти лям простатриваеться...

Код: sql
1.
2.
3.
select * from geo_ips
where `start`<= :ip
order by `start` limit 1;



половину таблицы сканирует.Скорее всего вы что-то не так делаете. Показывайте DDL таблицы, точный запрос, его план и прочие подробности.

Код: 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.
27.
28.
29.
30.
31.
CREATE TABLE `geo_ipranges` (
	`idgeo_iprange` BIGINT(20) NOT NULL AUTO_INCREMENT,
	`start` BIGINT(20) NOT NULL DEFAULT '0',
	`end` BIGINT(20) NOT NULL DEFAULT '0',
	`fk_idgeo_lacation` BIGINT(20) NOT NULL DEFAULT '0',
	PRIMARY KEY (`idgeo_iprange`),
	INDEX `fk_geo_ip__geo_location` (`fk_idgeo_lacation`),
	INDEX `AK_end` (`end`),
	INDEX `AK_start` (`start`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1986197;

explain 
select * from geo_ipranges
where `end` >= 1580060873
order by `end` desc limit 1

"id"	"select_type"	"table"	"type"	"possible_keys"	"key"	"key_len"	"ref"	"rows"	"Extra"
"1"	"SIMPLE"	"geo_ipranges"	"range"	"AK_end"	"AK_end"	"8"	\N	"990000"	"Using index condition"


explain 
select * from geo_ipranges
where `start` <= 1580060873
order by `start` limit 1;


"id"	"select_type"	"table"	"type"	"possible_keys"	"key"	"key_len"	"ref"	"rows"	"Extra"
"1"	"SIMPLE"	"geo_ipranges"	"range"	"AK_start"	"AK_start"	"8"	\N	"990000"	"Using index condition"
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716258
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

чуйдеса
analyze table не пробовали?
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716259
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

Вы слово desc ставите точно наоборот. Надо так:
Код: sql
1.
2.
3.
select * from geo_ipranges
where `start` <= 1580060873
order by `start` desc limit 1
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716262
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453
Код: sql
1.
2.
	`start` BIGINT(20) NOT NULL DEFAULT '0',
	`end` BIGINT(20) NOT NULL DEFAULT '0',

Кстати, тут простых UNSIGNED INT-ов будет достаточно. В других полях, возможно, тоже.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716263
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

а какая, собственно, разница? так и так надо всего одну запись найти по индексированной колонке.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716264
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirmiksoft,

а какая, собственно, разница? так и так надо всего одну запись найти по индексированной колонке.Ну, как минимум, в логике. Запрос, выдающий неверный результат, оптимизировать смысла не вижу.
Без DESC всегда будет выдаваться диапазон, который начинается с 0 (или какой там самый первый в конкретной базе).
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716266
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftalex564657498765453,

Вы слово desc ставите точно наоборот. Надо так:
Код: sql
1.
2.
3.
select * from geo_ipranges
where `start` <= 1580060873
order by `start` desc limit 1



это уже детали... по быстрому из битвин переделывал и запутался...суть таже пол таблицы просматривает

аналайз сделал. и оптимайз сделал
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716270
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже надо самому придумывать кластеризацию всего диапазона айпишников.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716273
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453miksoftalex564657498765453,

Вы слово desc ставите точно наоборот. Надо так:
Код: sql
1.
2.
3.
select * from geo_ipranges
where `start` <= 1580060873
order by `start` desc limit 1




это уже детали... по быстрому из битвин переделывал и запутался...Это не детали, это неверная логика запроса.
alex564657498765453суть таже пол таблицы просматриваетПодробности будут? Включая замеры времени.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716274
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453похоже надо самому придумывать кластеризацию всего диапазона айпишников.Действительно, зачем встроенную оптимизацию использовать, лучше свою придумать
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716282
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftБез DESC всегда будет выдаваться диапазон, который начинается с 0 (или какой там самый первый в конкретной базе).но даже для этого не надо просматривать полтаблицы
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716286
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirmiksoftБез DESC всегда будет выдаваться диапазон, который начинается с 0 (или какой там самый первый в конкретной базе).но даже для этого не надо просматривать полтаблицыПо идее не надо.
Насколько я понимаю, MySQL и не просматривает. Иначе вместо "Using index condition" было бы обычное using index.
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716309
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksofttanglirпропущено...
но даже для этого не надо просматривать полтаблицыПо идее не надо.
Насколько я понимаю, MySQL и не просматривает. Иначе вместо "Using index condition" было бы обычное using index.

таки да...пишет потенциальных 900 000 строк, но замер времени 30-40 мсек, как и выборка по индексу конкретного значения из других таблиц (правда на 20 млн записей)...


итого
выбор
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select * from geo_locations l

join (

select fk_idgeo_lacation 
			from geo_ipranges  
			where 1570080873 >= `start`
			order by `start` desc limit 1) ll on (ll.fk_idgeo_lacation = l.idgeo_location)


отрабатывает от 30 до 50 мсек.

но если выбирать не так, а скажем последние 200 логов приджоинить

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select l.*
from geo_locations l 
	join (select ( select i.fk_idgeo_lacation 
				from geo_ipranges i 
				where a.ip >= i.`start`
				order by i.`start` desc limit 1
			) as 'tt' 

#select last 10 logs
		from ap_files a order by a.idap_file desc limit 10
			
		) ll 	on (ll.tt=l.idgeo_location)
...
Рейтинг: 0 / 0
оптимизация between : where 'const' between f1 and f2
    #38716310
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

так вот, последний запрос отрабатывает за 8,798 sec

а так как надо обычно 200 логов последних посмотреть, то ...у меня хейдискл повис при запросе
к 200 последним.

походу надо тригером при вставке, одна колонка будет автозаполняться - сраззу ссылка на нужный локейшин
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / оптимизация between : where 'const' between f1 and f2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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