Хэш-индексы повышают производительность случайного чтения на 55%!
Хэш-индексы типа HashSet
или HashMap
полезны для обслуживания случайных запросов на чтение. Они повышают производительность при случайном доступе к данным, сокращают общее количество операций ввода-вывода и экономят процессорное время. Но они также могут быть дорогостоящими для приложений, которые редко выполняют случайные чтения, такие как
- Данные временных рядов или источника событий могут требовать только быстрого последовательного чтения.
- Холодное хранение или архивированные данные могут вообще не требовать случайного чтения.
Для Sway DB требуется настраиваемый хэш-индекс, чтобы можно было обрабатывать различные требования к хранению данных. Ниже были изложены требования:
- Необязательно включать или отключать хэш-индекс.
- Позволяют создавать идеальные или почти идеальные хэш-индексы.
- Создавайте частично индексированные хэш-индексы с возможностью возврата к альтернативным индексам, таким как двоичный поиск и линейный поиск.
- Скопируйте ключи непосредственно в хэш-индекс.
- Контролируемый параллелизм.
- Компрессия.
Пример конфигурации
Следующее создает постоянную Карту
, где хэш-индекс отключен.
Mapmap = MapConfig .functionsOff(Paths.get("myMap"), intSerializer(), stringSerializer()) .setRandomKeyIndex(RandomKeyIndex.disable()) .get(); map.put(1, "one"); map.get(1); //Optional[one]
Следующее включает хэш-индекс ( Индекс случайного ключа
) с пользовательской конфигурацией.
Mapmap = MapConfig .functionsOff(Paths.get("myMap"), intSerializer(), stringSerializer()) .setRandomKeyIndex( RandomKeyIndex .builder() .maxProbe(10) //re-hash 10 times to resolve hash collision .minimumNumberOfKeys(20) //minimum keys required .minimumNumberOfHits(10) //minimum indexed keys required //use reference format. IndexFormat.copyKeys() can also be used here //to copy keys directly into the hash-index .indexFormat(IndexFormat.reference()) .allocateSpace( (RandomKeyIndex.RequiredSpace optimalSpace) -> //allocates 3 times more storage than the //default optimal space for higher hit rate. optimalSpace.requiredSpace() * 3 ) //allow async IO for all IO operations .ioStrategy((IOAction ioAction) -> new IOStrategy.AsyncIO(true)) //Use LZ4 and fallback to Snappy. .compression((UncompressedBlockInfo info) -> Arrays.asList( //try running LZ4 with minimum 20.0% compression Compression.lz4Pair( new Pair(LZ4Instance.fastestInstance(), new LZ4Compressor.Fast(20.0)), new Pair(LZ4Instance.fastestInstance(), LZ4Decompressor.fastDecompressor()) ), //if LZ4 fails try Snappy with 20.0% compression. new Compression.Snappy(20.0) ) ) ) .get(); map.put(1, "one"); map.get(1); //Optional[one]
Для получения подробной документации по конфигурациям обратитесь к веб-сайту documentation .
Полезные ссылки
- SwayDB на GitHub.
- Java примеры репозитория.
- Kotlin примеры репо.
- Scala примеры репозитория.
- Веб-сайт документации – SwayDB.io .
Оригинал: “https://dev.to/simerplaha/hash-index-swaydb-4k8”