powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Простой запрос (поиск страны по IP) сильно тормозит
11 сообщений из 11, страница 1 из 1
Простой запрос (поиск страны по IP) сильно тормозит
    #39687438
amsdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите плз: есть задача поиска страны по IP адресу, используя справочник такого вида:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE IF NOT EXISTS GeoIP (
ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
IpFrom  BIGINT NOT NULL,
IpTo BIGINT NOT NULL,
Country VARCHAR (25) NOT NULL);

CREATE UNIQUE INDEX IF NOT EXISTS IpRangeIdx ON GeoIP (IpFrom,IpTo);
CREATE UNIQUE INDEX IF NOT EXISTS IpRangeEndIdx ON GeoIP (IpTo);



Так же пробовал создавать covering index (IpFrom,IpTo,Country).
Так же пробовал дополнительно создавать отдельные индексы для IpFrom и IpTo

Ну и для поиска используется простой запрос запрос вида:

Код: plsql
1.
SELECT Country FROM GeoIP WHERE IpFrom<=? AND IpTo>=?



Проблема в том, что удается делать максимум 6000 поисков в секунду (Windows 10, Core i7), что крайне мало (

EXPLAIN QUERY PLAN выдает: SEARCH TABLE GeoIP USING INDEX IpRangeEndIdx (IpTo>?)
Т.е. почему-то используется только один индекс только для второго значения.

При этом тестовый запрос вида
Код: plsql
1.
SELECT Country FROM GeoIP WHERE IpFrom=? AND IpTo=?


выполняется раз в 10-15 быстрее.

Наверняка можно как-то сделать быстрее! Но пока после 3 часов экспериментов не получается...

Помогите плз ! Уж вы то точно знаете как надо ! )))
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39687448
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это диапазоны IP адресов, то должно быть
1. Всегда IpFrom <= IpTo
2. Диапазоны не пересекаются

Если так, то конкретный IP адрес можно проверить так
Код: sql
1.
SELECT top 1 Country FROM GeoIP WHERE IpFrom<=? AND IpTo>=? order by IpFrom
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39687450
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще так попробуй
Код: sql
1.
... order by IpTo
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39687532
amsdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЕсли это диапазоны IP адресов

Да, именно диапазоны. Содержимое таблицы примерно такое:

IpFrom, IpTo, Country
16777216,16777471,Australia
16777472,16778239,China
16778240,16779263,Australia
16779264,16781311,China
16781312,16785407,Japan
....

К сожалению, LIMIT 1 и OrderBy IpTo не помогли - скорость никак не изменилась.
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39687533
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй такой вариант
Код: sql
1.
SELECT top 1 IpFrom, IpTo, Country FROM GeoIP WHERE IpTo>=? order by IpTo


После дополнительно проверить IpFrom<=?
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39687802
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amsdevНу и для поиска используется простой запрос запрос вида:

Код: plsql
1.
SELECT Country FROM GeoIP WHERE IpFrom<=? AND IpTo>=?



попробуй
Код: sql
1.
SELECT Country FROM GeoIP WHERE ? between IpFrom AND IpTo
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39688313
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уберите эти экзисты и нот экзисты. Вы же знаете где экзист, а где нот экзист. Может и поможет. Да, бегин и енд транзакций тоже помогает раз в десять.
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39688417
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, поможет - 9308178
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39688893
amsdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВозможно, поможет - 9308178

Большое спасибо, помогло !

Если переписать запрос вот так:

SELECT Country FROM (SELECT Country, IpTo FROM GeoIP WHERE ?>=IpFrom ORDER BY IpFrom DESC LIMIT 1) sub WHERE ?<=sub.IpTo

То получается в 36 (в тридцать шесть) раз быстрее !!!

Огромное спасибо за помощь ! Сам бы ни в жизнь не допер что с подзапросом будет быстрее !
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39688894
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amsdev, я почти тоже самое предлагал 21641978 , только допроверка в коде.
...
Рейтинг: 0 / 0
Простой запрос (поиск страны по IP) сильно тормозит
    #39689020
amsdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все помогли, всем огромное спасибо !
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Простой запрос (поиск страны по IP) сильно тормозит
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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