Your SlideShare is downloading. ×
Индексирование многомерных данных
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

754
views

Published on

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
754
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. http://mimimir.ru Индексирование многомерных данных Стас Кельвич Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 2. http://mimimir.ru Данные Запросы Какой софт использовать B-деревья Пространственные деревья PostgreSQL Point, Cube, KNN SQlite R-Tree (BDB layer) Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 3. http://mimimir.ru Данные Одна таблица или Materialized view 10^8 –10^9 записей Поля: целые числа и даты «Никакая» селективность Сохранность не критична Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 4. http://mimimir.ru Запросы «оконного» типа SELECT * FROM prices WHERE "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" = 0 ORDER BY value ASC LIMIT 20; Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 5. http://mimimir.ru Что использовать? NoSQL (mongo, redis, etc) Поисковые движки (sphinx, lucene и производные) SQL базы данных Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 6. http://mimimir.ru Древовидные структуры данных N ~ exp(d) d ~ log(N) Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 7. http://mimimir.ru Стандартный индекс по полю B-дерево и его варианты: B* PostreSQL, MySQL B++ MSSQL Индекс для страничной памяти Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 8. http://mimimir.ru Мультииндекс Мультииндекс == Индекс по compound key column1_column2_column3 Работает до первого неравенства Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 9. http://mimimir.ru Z-кривая Способ перенести многомерные данные в одно измерение с сохранением топологии (!) Медленный range Быстрый range есть, запатентован, Transbase (UB-tree) Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 10. http://mimimir.ru Несколько индексов в одном запросе Memory bitmap (PostgresQL) Метод для бедных, лучше чем ничего Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 11. http://mimimir.ru Пространственные деревья Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 12. http://mimimir.ru PostgreSQL Point CREATE INDEX ON prices USING GIST(point("from", "value")); SELECT * FROM prices WHERE point("from", "value") <@ box ((1354996800,1356897600),(90,8181)) ORDER BY value ASC LIMIT 20; Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 13. http://mimimir.ru we need to go deeper Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 14. http://mimimir.ru PostgreSQL Cube CREATE EXTENSION cube; CREATE INDEX ON prices USING GIST(cube(array[f1,f2,f3])); SELECT * FROM prices WHERE cube(array[f1,f2,f3]) <@ cube (10,10,10),(99,99,99); Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 15. http://mimimir.ru PostgreSQL KNN Search KNN, поиск ближайших соседей Неинформативный поиск: что-то среднее между условием в блоке WHERE и сортировкой в ORDER BY Начиная с PostgresQL 9.1 патч knngist включили в основную ветку Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 16. http://mimimir.ru PostgreSQL KNN Search Изменена функция отбора листьев (реагирует на ORDER BY) При обходе дерева строится priority queue Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 17. http://mimimir.ru PostgreSQL KNN Search Получаем отсортированные данные за одно сканирование индекса SELECT * FROM places WHERE location <@ box (100,100),(200,200) ORDER BY location <-> point (101,456) LIMIT 10; Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 18. 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; Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 19. http://mimimir.ru R-Tree в SQLite Стандартное расширение От одного до пяти измерений Бэкэндом может быть BerkeleyDB Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 20. http://mimimir.ru PostgreSQL SP-GIST Многообещающе, т.к. есть kd-tree Пока только для точек Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12
  • 21. http://mimimir.ru Спасибо за внимание! Индексирование многомерных данных, Стас Кельвич 15.12.2012Saturday, December 15, 12