When I create an index for a table in mysql, I see that the index_type is type BTREE
. Now although I understand about btree(s), I do not quiet understand how i
The database stores the value indexed as a B-Tree
key, and the record pointer as a B-Tree
value.
Whenever you search for a record holding a certain value of an indexed column, the engine locates the key holding this value in the B-Tree
, retrieves the pointer to the record and fetches the record.
What exactly is a "record pointer", depends on the storage engine.
In MyISAM
, the record pointer is an offset to the record in the MYI
file.
In InnoDB
, the record pointer is the value of the PRIMARY KEY
.
In InnoDB
, the table itself is a B-Tree
with a PRIMARY KEY
as a B-Tree
key. This is what called a "clustered index" or "index-organized table". In this case, all other fields are stored as a B-Tree
value.
In MyISAM
, the records are stored without any special order. This is called "heap storage".
MySQL InnoDB is actually using B+Tree which add more features than B-Tree.
Such as:
Only leaves node has values to allow more keys in the same page node to reduce tree high which will reduce I/O count.
Add a bidirectional pointer in each leaf node to make range search faster
B-Tree
B+Tree