Задавайте вопросы, мы ответим
Вы не зашли.
Я работаю с geocity lite БД, это база ip, плюс местоположение, многие пользовались наверное. Там ip даны в виде интервалов. Так вот, необходим был быстрый поиск с сравнением типа between. На B-tree скорость просто убогая (на 1,8 млн. примерно 7 секунд, индексы пробовал и на каждый ip, и на оба вместе). Сделал так - создал фиктивный квадрат в geometry polygon, с координатами ((minIP, 0) (minIP 2) (maxIP 2) (maxIP 0) (minIP 0)), и стал вести поиск новой точки в boundary как POINT(currentIP, 1). Скорость стала высокой (порядка 0,0001 сек.). У меня возникло сразу несколько вопросов.
1. Это изврат, очень неприлично выглядит. Может быть, есть другой способ навесить индекс на поля maxIP и minIP, чтобы не работать с Geomerty, о которых я ещё не додумался?
2. Когда создаю фиктивный "квадрат" с координатами ((minIP 0) (maxIP 0) (minIP 0)) опять скорость падает, хотя ищет всё также верно. С чем это связано? Достраивание до прямоугольника, нахождение макс. прямоугольника, который вмещает в себя фигуру?
P.S. Вариант с "разложением" всех ip из интервалов в сплошной список я рассматривал, размер становится жутким.
Отредактированно megamanx (02.07.2012 10:52:06)
Неактивен
Интересное решение с geometry.
Можно воспользоваться тем, что интервалы не пересекаются и искать ближайший таким способом:
Неактивен
Угу, так работает точно с такой же скоростью.
Отредактированно megamanx (03.07.2012 12:58:48)
Неактивен
http://habrahabr.ru/post/125467/ кстати в тему, недавно наткнулся. Использование geometry лучше, чем order by limit 1.
Неактивен