Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Специализированные высокопроизводительные индексыЕгоров ПавелСКБ Контур, Екатеринбургhttp://skbkontur.ru
Почему SQL – отстой?  :-)Типовые задачиАлгоритмы и структуры данных: решение типовых задач«Все уже украдено до нас!»Что осталось за кадром?
+Structured Query Language+   Атомарность и изоляция+   Контроль целостности
Купить более крутую железякуПотом ещё круче!И ещё…
Радикальное упрощение запросовШардинг
Structured Query Language
Атомарность и изоляция
Контроль целостности
Structured Query Language
Атомарность и изоляция
Контроль целостности
только от Васитолько важноеза период времениПоследние 10Over 9000Следующие / предыдущие 10
Highload: специализированные высокопроизводительные индексы
Что могут деревья поиска?Search, Add, RemoveO(log N)Итерирование в порядке возрастанияпереход на следующий элемент – O(1)Порядковый номер ключаO(log N)
Что понадобится нам?Insert(item)Delete(item)GetRange(first, last, count)GetCount(first, last)
Highload: специализированные высокопроизводительные индексы
Highload: специализированные высокопроизводительные индексы
Показать последние 10GetRange(	new Key(userId, DateTime.MaxValue, Guid.MaxValue),	new Key(userId, DateTime.MinValue, Guid.MinValue), 10)
Показать 10 предшествующих XGetRange(	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, friday, Guid.Min),	new Key(userId, vasyaId, Priority.High,monday, 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 inauthors)heap.Add(GetRange(a).GetEnumerator()); for(int j=0; j<M; j++){ vari = heap.ExtractRoot(); yieldreturni.Current; if(i.MoveNext()) heap.Add(i);}было O(A * M * log N)O(A * log N + M * log A)
Все уже украдено до нас!BerkeleyDBdb = 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.pdfWeb site: http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html
Все уже украдено до нас!CassandraSlicePredicate: start, finish, count, reversedclient.multiget_slice(… slicePredicate …)+ масштабируемость+ шардинг+ …
CassandraПод капотом: деревья в памяти + SSTables на дискеWeb site:http://cassandra.apache.org/
Все уже украдено до нас!Составные индексы SQL :-)
Что осталось за кадромНадежное хранениеМасштабированиеОтказоустойчивостьШардингКак жить с отложенной консистентностью?…

More Related Content

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