Upload
stas-kelvich
View
787
Download
1
Embed Size (px)
Citation preview
Индексирование многомерных данных, Стас Кельвич 15.12.2012
Индексированиемногомерных данных
Стас Кельвич
http://mimimir.ru
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Данные
Запросы
Какой софт использовать
B-деревья
Пространственные деревья
PostgreSQL Point, Cube, KNN
SQlite R-Tree (BDB layer)
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Одна таблица или Materialized view
10^8 –10^9 записей
Поля: целые числа и даты
«Никакая» селективность
Сохранность не критична
Данные
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Запросы «оконного» типа
SELECT *FROM pricesWHERE "adult_count" = 2 AND "country_id" = 1 AND "value" BETWEEN 90 AND 8181 AND "from" BETWEEN 1354996800 AND 1356897600 AND "night_count" BETWEEN 7 AND 10 AND "paid_children_count" = 0ORDER BY value ASCLIMIT 20;
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
NoSQL (mongo, redis, etc)
Поисковые движки(sphinx, lucene и производные)
SQL базы данных
Что использовать?
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
N ~ exp(d)
d ~ log(N)
Древовидные структуры данных
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Индекс для страничной памяти
Стандартный индекс по полю
B-дерево и его варианты:B* PostreSQL, MySQLB++ MSSQL
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Мультииндекс == Индекс по compound keycolumn1_column2_column3
Работает до первого неравенства
Мультииндекс
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Z-кривая
Способ перенести многомерные данные в одно измерение с сохранением топологии (!)
Медленный range
Быстрый range есть, запатентован, Transbase (UB-tree)
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Memory bitmap (PostgresQL)
Метод для бедных, лучше чем ничего
Несколько индексовв одном запросе
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Пространственные деревья
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
CREATE INDEX ON prices USING GIST(point("from", "value"));
SELECT * FROM pricesWHERE point("from", "value") <@ box '((1354996800,1356897600),(90,8181))'ORDER BY value ASCLIMIT 20;
PostgreSQL Point
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
we need to go deeper
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
PostgreSQL Cube
CREATE EXTENSION cube;
CREATE INDEX ON prices USINGGIST(cube(array[f1,f2,f3]));
SELECT * FROM prices WHEREcube(array[f1,f2,f3]) <@ cube '(10,10,10),(99,99,99)';
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
KNN, поиск ближайших соседей
Неинформативный поиск: что-то среднее между условием в блоке WHERE и сортировкой в ORDER BY
Начиная с PostgresQL 9.1 патч knngist включили в основную ветку
PostgreSQL KNN Search
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Изменена функция отбора листьев (реагирует на ORDER BY)
При обходе дерева строится priority queue
PostgreSQL KNN Search
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
SELECT * FROM places WHERE location <@ box '(100,100),(200,200)'ORDER BY location <-> point '(101,456)'LIMIT 10;
PostgreSQL KNN Search
Получаем отсортированные данныеза одно сканирование индекса
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Оператор <*>Левый аргумент:кубик
Правый аргумент:2*k сортировка по k-ой коорд. по возрастанию2*k+1 сортировка по k-ой коорд. по убыванию
SELECT * FROM prices WHERE cube(array[f1,f2,f3]) <@ cube '(10,10,10),(99,99,99)'ORDER BY cube <*> 6;
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Стандартное расширение
От одного до пяти измерений
Бэкэндом может быть BerkeleyDB
R-Tree в SQLite
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Многообещающе, т.к. есть kd-tree
Пока только для точек
PostgreSQL SP-GIST
Saturday, December 15, 12
Индексирование многомерных данных, Стас Кельвич 15.12.2012
http://mimimir.ru
Спасибоза внимание!
Saturday, December 15, 12