MySQL源碼分析:源碼文件結構及主要數據結構


原文地址:http://blog.itpub.net/30186219/viewspace-1481125/
BUILD: 內含在各個平台、各種編譯器下進行編譯的腳本。如compile-pentium-debug表示在pentium架構上進行編譯的腳本。
Client: 客戶端工具,如mysql, mysqladmin之類。
Cmd-line-utils: readline, libedit工具。
Config: 給aclocal使用的配置文件。
Dbug: 提供一些調試用的宏定義。
Extra: 提供innochecksum,resolveip等額外的小工具。
Include: 包含的頭文件
Libmysql: 庫文件,生產libmysqlclient.so。
Libmysql_r: 線程安全的庫文件,生成libmysqlclient_r.so。
Libservices: 5.5.0中新加的目錄,實現了打印功能。
Man: 手冊頁。
Mysql-test: mysqld的測試工具一套。
Mysys:包含了對於系統調用的封裝,用以方便實現跨平台。MySQL自己實現了一套常用的數據結構和算法,如string, hash等。
Netware: 在netware平台上進行編譯時需要的工具和庫。
Plugin:插件的目錄,目前有一個全文搜索插件(只能用在myisam存儲引擎)。
Pstack: 異步棧追蹤工具。
Regex: 正則表達式工具。
Scripts: 提供腳本工具,如mysql_install_db等
Sql:
mysql主要代碼,數據庫主程序mysqld所在的地方。大部分的系統流程都發生在這里。你還能看到sql_insert.cc, sql_update.cc, sql_select.cc,等等,分別實現了對應的SQL命令。后面我們還要經常提到這個目錄下的文件。
大概有如下及部分:
SQL解析器代碼: sql_lex.cc, sql_yacc.yy, sql_yacc.cc, sql_parse.cc等,實現了對SQL語句的解析操作。
"handler"代碼: handle.cc, handler.h,定義了存儲引擎的接口。
"item"代碼:item_func.cc, item_create.cc,定義了SQL解析后的各個部分。
SQL語句執行代碼: sql_update.cc, sql_insert.cc sql_select.cc, sql_show.cc, sql_load.cc,執行SQL對應的語句。當你要看"SELECT ..."的執行的時候,直接到sql_select.cc去看就OK了。
輔助代碼: net_serv.cc實現網絡操作
還有其他很多代碼。
Sql-bench: 一些評測代碼。
Sql-common: 存放部分服務器端和客戶端都會用到的代碼。
Storage:
這個目錄包含了所謂的Mysql存儲引擎 (storage engine)。存儲引擎是數據庫系統的核心,封裝了數據庫文件的操作,是數據庫系統是否強大最重要的因素。Mysql實現了一個抽象接口層,叫做handler(sql/handler.h),其中定義了接口函數,比如:ha_open, ha_index_end, ha_create等等,存儲引擎需要實現這些接口才能被系統使用。這個接口定義超級復雜,有900多行 :-(,不過我們暫時知道它是干什么的就好了,沒必要深究每行代碼。對於具體每種引擎的特點,我推薦大家去看mysql的在線文檔: http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html
應該能看到如下的目錄:
* innobase, innodb的目錄,當前最流行的存儲引擎
* myisam, 最早的Mysql存儲引擎,一直到innodb出現以前,使用最廣的引擎。
* heap, 基於內存的存儲引擎
* federated, 一個比較新的存儲引擎
* example, csv,這幾個大家可以作為自己寫存儲引擎時的參考實現,比較容易讀懂
Strings: string庫。
Support-files: my.cnf示例配置文件。
Tests: 測試文件所在目錄。
Unittest: 單元測試。
Vio:封裝了virtual IO接口,主要是封裝了各種協議的網絡操作。
Win: 給windows平台提供的編譯環境。
Zip: zip庫工具
2. 主要數據結構
THD 線程描述符(sql/sql_class.h)
包含處理用戶請求時需要的相關數據,每個連接會有一個線程來處理,在一些高層函數中,此數據結構常被當作第一個參數傳遞。
NET net; // 客戶連接描述符
Protocol *protocol; // 當前的協議
Protocol_text protocol_text; // 普通協議
Protocol_binary protocol_binary; // 二進制協議
HASH user_vars; //用戶變量的hash值
String packet; // 網絡IO時所用的緩存
String convert_buffer; // 字符集轉換所用的緩存
struct sockaddr_in remote; //客戶端socket地址
THR_LOCK_INFO lock_info; // 當前線程的鎖信息
THR_LOCK_OWNER main_lock_id; // 在舊版的查詢中使用
THR_LOCK_OWNER *lock_id; //若非main_lock_id, 指向游標的lock_id
pthread_mutex_t LOCK_thd_data; //thd的mutex鎖,保護THD數據(thd->query, thd->query_length)不會被其余線程訪問到。
Statement_map stmt_map; //prepared statements和stored routines 會被重復利用
int insert(THD *thd, Statement *statement); // statement的hash容器
class Statement::
LEX_STRING name; /* prepared statements的名字 */
LEX *lex; //語法樹描述符
bool set_db(const char *new_db, size_t new_db_len)
void set_query(char *query_arg, uint32 query_length_arg);
{
pthread_mutex_lock(&LOCK_thd_data);
set_query_inner(query_arg, query_length_arg);
pthread_mutex_unlock(&LOCK_thd_data);
}
NET 網絡連接描述符(sql/mysql_com.h)
網絡連接描述符,對內部數據包進行了封裝,是client和server之間的通信協議。
Vio *vio; //底層的網絡I/O socket描述符
unsigned char *buff,*buff_end,*write_pos,*read_pos; //緩存相關
unsigned long remain_in_buf,length, buf_length, where_b;
unsigned long max_packet,max_packet_size; //當前值;最大值
unsigned int pkt_nr,compress_pkt_nr; //當前(未)壓縮包的順序值
my_bool compress; //是否壓縮
unsigned int write_timeout, read_timeout, retry_count; //最大等待時間
unsigned int *return_status; //thd中的服務器狀態
unsigned char reading_or_writing;
/*1 代表讀, 2 代表寫, 0代表無狀態 */
unsigned int last_errno; //返回給客戶端的錯誤號
unsigned char error;
/*0:執行成功
1:在協議層有邏輯錯誤
2:系統調用或標准庫出錯
3:特例,表示緩存不能裝下當前這么大的包
*/
TABLE 數據庫表描述符(sql/table.h)
數據庫表描述符,分成TABLE和TABLE_SHARE兩部分。
handler *file; //指向這張表在storage engine中的handler的指針
THD *in_use; /* 使用這張表的thread號 */
Field **field; /* 指向數據域的指針*/
uchar *record[2]; /* 指向記錄的指針*/
uchar *write_row_record; /* 在THD::write_row中用來做優化 */
uchar *insert_values; /* INSERT ... UPDATE語句用 */
/*
可用來直接獲取表中數據而不用讀取行的當前key的映射值
*/
key_map covering_keys;
key_map quick_keys, merge_keys;
key_map keys_in_use_for_query;
/* 可用以生成GROUP BY結果的key映射值 */
key_map keys_in_use_for_group_by;
/* 可用以生成ORDER BY 結果的key映射值 */
key_map keys_in_use_for_order_by;
KEY *key_info; /* 數據庫中key的信息*/
HASH name_hash; //數據域名字的hash值
MEM_ROOT mem_root; //內存塊
LEX_STRING db;
LEX_STRING table_name;
LEX_STRING table_cache_key;
enum db_type db_type //當前表的storage engine類型
enum row_type row_type //當前記錄是定長還是變長
uint primary_key;
uint next_number_index; //自動增長key的值
bool is_view ;
bool crashed;
FIELD 字段描述符(sql/field.h)
域描述符,是各種字段的抽象基類。
uchar *ptr; // 記錄中數據域的位置
uchar *null_ptr; // 記錄 null_bit 位置的byte
TABLE *table; // 指向表的指針
TABLE *orig_table; // 指向原表的指針
const char **table_name, *field_name;
LEX_STRING comment;
/* 數據域是下列key的一部分 */
key_map key_start, part_of_key, part_of_key_not_clustered;
key_map part_of_sortkey;
/*各種數據域的類型*/
enum utype { NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,
CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,
BIT_FIELD, TIMESTAMP_OLD_FIELD, CAPITALIZE, BLOB_FIELD,
TIMESTAMP_DN_FIELD, TIMESTAMP_UN_FIELD, TIMESTAMP_DNUN_FIELD};
…..
virtual int store(const char *to, uint length,CHARSET_INFO *cs)=0;
inline String *val_str(String *str) { return val_str(str, str); }
Utility API Calls 各種API
各種核心的工具,例如內存分配,字符串操作或文件管理。標准C庫中的函數只使用了很少一部分,C++中的函數基本沒用。
void *my_malloc(size_t size, myf my_flags) //對malloc的封裝
size_t my_write(File Filedes, const uchar *Buffer, size_t Count, myf MyFlags) //對write的封裝
Preprocessor Macros 處理器宏
Mysql中使用了大量的C預編譯,隨編譯參數的不同最終代碼也不同。
#define max(a, b) ((a) > (b) ? (a) : (b)) //得出兩數中的大者
do \
{ \
char compile_time_assert[(X) ? 1 : -1] \
__attribute__ ((unused)); \
} while(0)

使用gcc的attribute屬性指導編譯器行為
? Global variables 全局變量
? configuration settings
? server status information
? various data structures shared among threads
主要包括一些全局的設置,服務器信息和部分線程間共享的數據結構。
struct system_status_var global_status_var; //全局的狀態信息
struct system_variables global_system_variables; //全局系統變量

注:本文系轉載,如有侵權,請聯系我,534624117@qq.com。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM