21
Индексирование многомерных данных, Стас Кельвич 15.12.2012 Индексирование многомерных данных Стас Кельвич http://mimimir.ru Saturday, December 15, 12

Индексирование многомерных данных

Embed Size (px)

Citation preview

Page 1: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

Индексированиемногомерных данных

Стас Кельвич

http://mimimir.ru

Saturday, December 15, 12

Page 2: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Данные

Запросы

Какой софт использовать

B-деревья

Пространственные деревья

PostgreSQL Point, Cube, KNN

SQlite R-Tree (BDB layer)

Saturday, December 15, 12

Page 3: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Одна таблица или Materialized view

10^8 –10^9 записей

Поля: целые числа и даты

«Никакая» селективность

Сохранность не критична

Данные

Saturday, December 15, 12

Page 4: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 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

Page 5: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

NoSQL (mongo, redis, etc)

Поисковые движки(sphinx, lucene и производные)

SQL базы данных

Что использовать?

Saturday, December 15, 12

Page 6: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

N ~ exp(d)

d ~ log(N)

Древовидные структуры данных

Saturday, December 15, 12

Page 7: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Индекс для страничной памяти

Стандартный индекс по полю

B-дерево и его варианты:B* PostreSQL, MySQLB++ MSSQL

Saturday, December 15, 12

Page 8: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Мультииндекс == Индекс по compound keycolumn1_column2_column3

Работает до первого неравенства

Мультииндекс

Saturday, December 15, 12

Page 9: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Z-кривая

Способ перенести многомерные данные в одно измерение с сохранением топологии (!)

Медленный range

Быстрый range есть, запатентован, Transbase (UB-tree)

Saturday, December 15, 12

Page 10: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Memory bitmap (PostgresQL)

Метод для бедных, лучше чем ничего

Несколько индексовв одном запросе

Saturday, December 15, 12

Page 11: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Пространственные деревья

Saturday, December 15, 12

Page 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

Page 13: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

we need to go deeper

Saturday, December 15, 12

Page 14: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 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

Page 15: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

KNN, поиск ближайших соседей

Неинформативный поиск: что-то среднее между условием в блоке WHERE и сортировкой в ORDER BY

Начиная с PostgresQL 9.1 патч knngist включили в основную ветку

PostgreSQL KNN Search

Saturday, December 15, 12

Page 16: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Изменена функция отбора листьев (реагирует на ORDER BY)

При обходе дерева строится priority queue

PostgreSQL KNN Search

Saturday, December 15, 12

Page 17: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 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

Page 18: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 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

Page 19: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Стандартное расширение

От одного до пяти измерений

Бэкэндом может быть BerkeleyDB

R-Tree в SQLite

Saturday, December 15, 12

Page 20: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Многообещающе, т.к. есть kd-tree

Пока только для точек

PostgreSQL SP-GIST

Saturday, December 15, 12

Page 21: Индексирование многомерных данных

Индексирование многомерных данных, Стас Кельвич 15.12.2012

http://mimimir.ru

Спасибоза внимание!

Saturday, December 15, 12