LevelDB storage engine MS1
This page describes what will be implemented for milestone#1.
Contents
Feature Description
How the data is stored in LevelDB
One leveldb instance
We will use one LevelDB instance for mysqld process. LevelDB keys will be prefixed with 'dbname.table_name.PRIMARY' for the table itself, and 'dbname.table_name.index_name' for the secondary indexes. This allows to store arbitrary number of tables/indexes in one LevelDB instance.
Data encoding
We will rely on LevelDB's compression to make the storage compact. Data that goes into LevelDB's key will be stored in KeyTupleFormat (which allows mysql's lookup/index ordering functions to work).
Data that goes into LevelDB's value will be stored in table->record[0] format, except blobs. (Blobs will require special storage convention because they store a char* pointer in table->record[0]).
We will need to support blobs because table nodetable
has a mediumtext
field.
Secondary indexes
Non-unique secondary indexes will be supported.
LevelDB stores {KEY->VALUE} mappings. Non-unique index will need to have some unique values for KEY. This is possible if we do
KEY = {index_columns, primary_key_columns}. VALUE = {nothing}
(todo: check if leveldb allows zero-sized values).
Using primary key as suffix will make DB::Get() useless. Instead, we will have to do lookups with:
get(secondary_index_key_val) { open cursor for (secondary_index_key_val) read the first record if (record > secondary_index_key_val) return NOT_FOUND; else return FOUND; }
TODO: we will not support unique secondary indexes in MS1. ALTER/CREATE TABLE statements attempting to add a unique index will fail. Is this ok?
Concurrency handling
(TODO stuff from locking proposal here)
Command handling
(TODO stuff from locking proposal here)
What will not be supported
Non-blocking schema changes will not be supported at all in the first milestone. All DDL-modifying operations will use pump all the data from the original table to the table with the new DDL.
Binlog XA on the master will not be supported.
Crash-proof slave will not be supported.
Other details
- The patch will be against mysql-5.6