MySQL是一款開源的關系型數據庫管理系統,其源代碼中的數據結構十分重要。下面我們將從表結構、索引、日志等多個方面來分析MySQL源代碼中的數據結構。
表結構數據結構
struct TABLE { ... TABLE_SHARE *s; /* share info between instances of a table */ TABLE *next; /* hash chain */ ... List- *pos; /* pos of non-const exprs in select-list */ List
- *ref_key; /* key-refs in WHERE and ORDER BY */ ... List
- key_parts; /* keys extracted by parser */ List
keys; /* real keys sorted in usage order */ ... TYPE type; CHARSET_INFO *charset; ... bool needs_rebuild; /* true, if table needs rebuild */ bool in_use; /* used in one query */ class Auto_increment_Global *auto_inc; ... };
在MySQL中,table代表一個關系表。表結構中最重要的就是keys,表示了當前表所擁有的所有索引,這個索引列表是按照使用次數排序的。需要注意的是,這里的索引是按照鍵值的順序存儲的,而非按照記錄的順序存儲的。
索引數據結構
struct KEY { ... TABLE *table; /* table handle (from THD) */ List- key_parts; /* key parts, stored as a string */ uint32 key_length; /* length of key_parts in bytes */ void *data; /* used by handler to keep index status */ uint keytype; /* key unique and/or reverse flag */ Field **null_field; /* fields used in dynamic index */ Field ***null_row; /* dynamic's null_row cache */ List
- *org_key_parts; /* key parts before sorting */ bool keep_prefix; /* keep not distinct prefix values */ bool unique; /* if key is unique */ bool inc; /* if key is auto_increment */ bool has_null_part; /* if the key has a NULL component */ bool on_dups_remove; /* if key is PRIMARY and ON DUPLICATE REMOVE clause */ };
在MySQL中,KEY是索引的表示方式。key_parts中存儲了該索引涉及到的列,keytype中存儲了索引的類型(唯一的、逆序的等),unique屬性表示了該索引是否為唯一的。
日志數據結構
struct binlog_item { enum ItemType item_type; /* number of bytes used in buffer */ uint32 length; uchar *ptr; ... };
MySQL中使用二進制日志實現了數據備份和恢復等功能,binlog_item中封裝了一個binlog事件的基本信息。其中item_type表示事件類型,length和ptr分別表示事件內容的長度和存儲位置。
上一篇css 模擬光標