mysqld 程序運行原理
mysqld 程序結構
? 連接層:執(zhí)行上調語句 首先要連接到數據庫
? ? ? ? 連接層
1.提供鏈接協(xié)議(連接的方法)
? socket(方法1 本地連接)
? TCP/IP(方法2 遠程連接)
2.接收到命令 驗證用戶名(root@'loacalhost')密碼的合法性
? ? ? 驗證用戶 驗證地址
3.接受SQL語句 派生一個專用的鏈接線程(接受語句 返回結果)
? 返回結果
? ? ? ? ? show processlist;? 查看當前連接的線程
? 思考
? ? ? 改密碼的參數在哪里做的手腳
? --skip-grant-tables 跳過授權表 不驗證用戶名密碼
? --skip-networking? 僅限本地登陸 否則就成裸奔了
? SQL層(優(yōu)化方面虑啤,至關重要的)
? ? ? ? 專門做語句的處理工作? SQL轉給SQL層來進行處理
連接層輸入語句 回車 就交到了SQL層 之后
第一步 :驗證SQL語法 和 SQL_MODE 是否正確
第二部 :驗證語義
第三部 :驗證這條SQL語句的權限
第四部 :SQL語句預處理
? ? ? ? 1.解析器進行語句解析 生成執(zhí)行計劃a b c三中方案(解析樹)
2.優(yōu)化器 有各種基于執(zhí)行代價的算法
? 根據算法 找到代價最低的執(zhí)行計劃
? 代價:基于 CPU IO 內存? 資源的消耗
第五步 :執(zhí)行器按照優(yōu)化器選擇執(zhí)行計劃 執(zhí)行SQL語句
? ? ? ? 得出獲取數據的方法
未完待續(xù) :假設命令不停的執(zhí)行很多次
? ? ? ? ? ? ? ? 不可能整個流程都走一遍? 這樣浪費資源
這時候提供query cache緩存服務(默認不開)? 不過這個一般是不開的? 都是用Redis替代
記錄操作日志 (binlog日志)包括備份恢復? 主從復制
? ? ? ? ? ? ? ? ? ? ? 手動開? 默認也不開? 非常重要的日志文件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SQL層 提供的日志? 只記錄修改類的操作
? 存儲引擎層(和磁盤打交道的一個層次)
? ? 根據SQL提供的獲取數據的方法 拿到數據 返回給SQL層 數據結構換成人類可讀的數據表的結構
? ? 再由連接層的線程 返回給用戶