Highload. Создание специализированных...

31
Специализированные высокопроизводительные индексы Егоров Павел СКБ Контур, Екатеринбург http://skbkontur.ru/career/vacancies 3-я конференция .NET разработчиков 25 сентября 2011

description

По материалам конференции .NET разработчиков - www.dotnetconf.ru

Transcript of Highload. Создание специализированных...

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

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

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

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

3-я конференция .NET разработчиков25 сентября 2011

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Последние 10

Over 9000

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

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

• Search, Add, RemoveO(log N)

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

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

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

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

Insert(item)Delete(item)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

friday, Guid.Max)10);

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

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

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

GetRange(... katyaId ..., M))).OrderBy(k => k.Timestamp).Take(M);

O(A * M * log N) А можно ли эффективнее?

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

HEAP

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

Page 22: 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; k++){

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 23: Highload. Создание специализированных высокопроизводительных индексов
Page 24: 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 26: Highload. Создание специализированных высокопроизводительных индексов

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

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

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

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

Cassandra

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

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

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

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

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

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

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

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

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

Конец!

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

[email protected]/xoposhiy