310 likes | 486 Views
3 -я конференция .NET разработчиков 2 5 сентября 2011. Специализированные высокопроизводительные индексы. Егоров Павел СКБ Контур, Екатеринбург http://skbkontur.ru/career/vacancies. Почему SQL – отстой? :-) Типовые задачи А лгоритмы и структуры данных: решение типовых задач
E N D
3-я конференция .NET разработчиков 25 сентября 2011 Специализированные высокопроизводительные индексы Егоров Павел СКБ Контур, Екатеринбург http://skbkontur.ru/career/vacancies
Почему SQL – отстой? :-) • Типовые задачи • Алгоритмы и структуры данных: решение типовых задач • «Все уже украдено до нас!» • Что осталось за кадром?
+Structured Query Language • + Атомарность и изоляция • + Контроль целостности
Купить более крутую железяку • Потом ещё круче! • И ещё…
Радикальное упрощение запросов • Шардинг
Structured Query Language • Атомарность и изоляция • Контроль целостности Structured Query Language Атомарность и изоляция Контроль целостности
только от Васи только важное за период времени Последние 10 Over 9000 Следующие / предыдущие 10
Что могут деревья поиска? • Search, Add, Remove O(log N) • Итерирование в порядке возрастания переход на следующий элемент – O(1) • Порядковый номер ключа O(log N)
Что понадобится нам? • Insert(item)Delete(item) • GetRange(first, last, count)GetCount(first, last)
Показать последние 10 • GetRange( • new Key(userId, DateTime.MaxValue, Guid.MaxValue), • new Key(userId, DateTime.MinValue, Guid.MinValue), • 10)
Показать 10 предшествующих X • GetRange( • new Key(userId, X.Timestamp, X.ItemId), • new Key(userId, DateTime.MinValue, Guid.MinValue), • 10)
…пришедших от Васи • GetRange( • new Key(userId, vasya.Id, DateTime.Max, Guid.Max), • new Key(userId, vasya.Id, DateTime.Min, Guid.Min), • 10);
Важные, от Васи, с понедельника по пятницу • GetRange( • new Key(userId, vasyaId, Priority.High, • monday, Guid.Min), • new Key(userId, vasyaId, Priority.High, • friday, Guid.Max) • 10);
От Васи, Пети, и Кати • GetRange(... vasyaId ..., M).Union( • GetRange(... petyaId..., M).Union( • GetRange(... katyaId..., M))) • .OrderBy(k => k.Timestamp).Take(M); O(A * M * log N)А можно ли эффективнее?
HEAP • Вставка – O(log N) • Извлечение минимального элемента O(log N)
IEnumerable<Key>GetRange(string author); var heap = new Heap<IEnumerator<Key>>(); foreach(vara in authors){ heap.Add(GetRange(a).GetEnumerator()); for(int j=0; j<M; k++){ vari = heap.ExtractRoot(); yieldreturni.Current; if(i.MoveNext()) heap.Add(i); } O(A * log N + M * log A) было O(A * M * log N)
Все уже украдено до нас!BerkeleyDB • db = BTreeDatabase.Open(“dbFile”, “dbName”, cfg); • using(var cur = db.Cursor(…)) • { • if(cur.Move(newDatabaseEntry(keyBytes), true)) • returntrue; • } • returnfalse;
Berkeley DB • Под капотом B+Tree (или Hash) • Whitepaper: http://www.usenix.org/event/usenix99/full_papers/olson/olson.pdf • Web site: http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html
Все уже украдено до нас!Cassandra • SlicePredicate: start, finish, count, reversed • client.multiget_slice(… slicePredicate …) • + масштабируемость • + шардинг • + …
Cassandra • Под капотом: • деревья в памяти + SSTables на диске • Web site: • http://cassandra.apache.org/
Все уже украдено до нас! • Составные индексы SQL :-)
Что осталось за кадром • Надежное хранение • Масштабирование • Отказоустойчивость • Шардинг • Как жить с отложенной консистентностью? • …
Конец! • Павел Егоров • СКБ Контур, Екатеринбург • pe@skbkontur.ru • twitter.com/xoposhiy