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

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

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

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

"точка входит в отрезок"
что в мускле для этого есть? лучше, чем ртри? я не знаю.
...
Рейтинг: 0 / 0
08.08.2014, 16:40:05
    #38716219
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
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
08.08.2014, 16:45:50
    #38716226
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
лично я уже начинаю думать, может сделать таблицу свою диапазонов айпи по типу...

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

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

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

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


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

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



половину таблицы сканирует.Скорее всего вы что-то не так делаете. Показывайте DDL таблицы, точный запрос, его план и прочие подробности.
...
Рейтинг: 0 / 0
08.08.2014, 17:05:56
    #38716249
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
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
08.08.2014, 17:12:59
    #38716258
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
alex564657498765453,

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

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

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

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

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

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



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

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

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




это уже детали... по быстрому из битвин переделывал и запутался...Это не детали, это неверная логика запроса.
alex564657498765453суть таже пол таблицы просматриваетПодробности будут? Включая замеры времени.
...
Рейтинг: 0 / 0
08.08.2014, 17:27:54
    #38716274
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
alex564657498765453похоже надо самому придумывать кластеризацию всего диапазона айпишников.Действительно, зачем встроенную оптимизацию использовать, лучше свою придумать
...
Рейтинг: 0 / 0
08.08.2014, 17:31:02
    #38716282
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
miksoftБез DESC всегда будет выдаваться диапазон, который начинается с 0 (или какой там самый первый в конкретной базе).но даже для этого не надо просматривать полтаблицы
...
Рейтинг: 0 / 0
08.08.2014, 17:33:06
    #38716286
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
tanglirmiksoftБез DESC всегда будет выдаваться диапазон, который начинается с 0 (или какой там самый первый в конкретной базе).но даже для этого не надо просматривать полтаблицыПо идее не надо.
Насколько я понимаю, MySQL и не просматривает. Иначе вместо "Using index condition" было бы обычное using index.
...
Рейтинг: 0 / 0
08.08.2014, 18:03:23
    #38716309
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
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
08.08.2014, 18:06:22
    #38716310
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация between : where 'const' between f1 and f2
alex564657498765453,

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

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

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


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