30
Специализированные высокопроизводительн ые индексы Егоров Павел СКБ Контур, Екатеринбург http://skbkontur.ru

Highload: специализированные высокопроизводительные индексы

Embed Size (px)

DESCRIPTION

Highload: высокопроизводительные специализированные индексы. Мотивация, алгоритмическая основа, готовые решения

Citation preview

Page 1: Highload: специализированные высокопроизводительные индексы

Специализированные высокопроизводительные

индексыЕгоров Павел

СКБ Контур, Екатеринбургhttp://skbkontur.ru

Page 2: Highload: специализированные высокопроизводительные индексы

1. Почему SQL – отстой? :-)2. Типовые задачи

3. Алгоритмы и структуры данных: решение типовых задач

4. «Все уже украдено до нас!»5. Что осталось за кадром?

Page 3: Highload: специализированные высокопроизводительные индексы

+ Structured Query Language+ Атомарность и изоляция+ Контроль целостности

Page 4: Highload: специализированные высокопроизводительные индексы

Купить более крутую железякуПотом ещё круче!И ещё…

Page 5: Highload: специализированные высокопроизводительные индексы

Радикальное упрощение запросовШардинг

Page 6: Highload: специализированные высокопроизводительные индексы

• Structured Query Language• Атомарность и изоляция• Контроль целостности

• Structured Query Language• Атомарность и изоляция• Контроль целостности

Page 7: Highload: специализированные высокопроизводительные индексы
Page 8: Highload: специализированные высокопроизводительные индексы

Следующие / предыдущие 10

только от Васитолько важноеза период времени

Последние 10

Over 9000

Page 9: Highload: специализированные высокопроизводительные индексы
Page 10: Highload: специализированные высокопроизводительные индексы

Что могут деревья поиска?

• Search, Add, RemoveO(log N)

• Итерирование в порядке возрастанияпереход на следующий элемент – O(1)

• Порядковый номер ключаO(log N)

Page 11: Highload: специализированные высокопроизводительные индексы

Что понадобится нам?

Insert(item)Delete(item)

GetRange(first, last, count)GetCount(first, last)

Page 12: Highload: специализированные высокопроизводительные индексы
Page 13: Highload: специализированные высокопроизводительные индексы
Page 14: Highload: специализированные высокопроизводительные индексы

Показать последние 10

GetRange(new Key(userId, DateTime.MaxValue, Guid.MaxValue),new Key(userId, DateTime.MinValue, Guid.MinValue), 10)

Page 15: Highload: специализированные высокопроизводительные индексы

Показать 10 предшествующих X

GetRange(new Key(userId, X.Timestamp, X.ItemId),new Key(userId, DateTime.MinValue, Guid.MinValue), 10)

Page 16: Highload: специализированные высокопроизводительные индексы

…пришедших от Васи

GetRange(new Key(userId, vasya.Id, DateTime.Max, Guid.Max),new Key(userId, vasya.Id, DateTime.Min, Guid.Min), 10);

Page 17: Highload: специализированные высокопроизводительные индексы

Важные, от Васи, с понедельника по пятницу

GetRange(new Key(userId, vasyaId, Priority.High,

friday, Guid.Min),new Key(userId, vasyaId, Priority.High,

monday, Guid.Max)10);

Page 18: Highload: специализированные высокопроизводительные индексы

От Васи, Пети, и Кати

GetRange(... vasyaId ..., M).Union (GetRange(... petyaId ..., M).Union(

GetRange(... katyaId ..., M))).OrderBy(k => k.Timestamp).Take(M);O(A * M * log N) А можно ли эффективнее?

Page 19: Highload: специализированные высокопроизводительные индексы

HEAP

• Вставка – O(log N)• Извлечение минимального элемента O(log N)

Page 20: Highload: специализированные высокопроизводительные индексы

IEnumerable<Key> GetRange (string author);

var heap = new Heap<IEnumerator<Key>>();foreach(var a in authors)

heap.Add(GetRange(a).GetEnumerator()); for(int j=0; j<M; j++){

var i = heap.ExtractRoot(); yield return i.Current; if (i.MoveNext())

heap.Add(i);}

O(A * log N + M * log A)

было O(A * M * log N)

Page 21: Highload: специализированные высокопроизводительные индексы

Все уже украдено до нас!BerkeleyDB

db = BTreeDatabase.Open(“dbFile”, “dbName”, cfg);

using (var cur = db.Cursor(…)) {if (cur.Move(new DatabaseEntry(keyBytes), true))

return true;} return false;

Page 23: Highload: специализированные высокопроизводительные индексы

Все уже украдено до нас!Cassandra

SlicePredicate: start, finish, count, reversedclient.multiget_slice(… slicePredicate …)

+ масштабируемость+ шардинг+ …

Page 24: Highload: специализированные высокопроизводительные индексы

Cassandra

Под капотом: деревья в памяти + SSTables на диске

Web site:http://cassandra.apache.org/

Page 25: Highload: специализированные высокопроизводительные индексы

Все уже украдено до нас!

Составные индексы SQL :-)

Page 26: Highload: специализированные высокопроизводительные индексы

Что осталось за кадром

Надежное хранениеМасштабированиеОтказоустойчивостьШардингКак жить с отложенной консистентностью?…

Page 27: Highload: специализированные высокопроизводительные индексы

Общая картинка

Тут была импровизация с рисованием маркерами на доске :-)

Я рассказал о том, как все устроено в целом, как взаимодействую индексы и хранилище и т.п.

Page 28: Highload: специализированные высокопроизводительные индексы

Общая картинка

Есть ещё одна презентация, немного раскрывающая тему общей картинки:

http://www.slideshare.net/xoposhiy/highload-dump-2011

Page 29: Highload: специализированные высокопроизводительные индексы
Page 30: Highload: специализированные высокопроизводительные индексы

Конец!

Павел ЕгоровСКБ Контур, Екатеринбург

[email protected]/xoposhiy