## MySQL服務器構成
### 1.1 客戶端與服務器端模型
MySQL是一個典型的C/S模式,單進程多線程的服務結構。MySQL自帶的客戶端程序在/usr/local/mysql/bin下,如:mysql、 mysqladmin、mysqldump等;服務端程序是mysqld(即守護進程,二進制的程序)

### 1.2 應用程序連接MySQL的方式
#### 1.2.1 TCP/IP方式
- 通過網絡連接串:
```text
[root@db02 ~]# mysql -uroot -p12345678 -h 127.0.0.1
```

#### 1.2.2 Socket方式
- 通過套接字文件:
```text
[root@db02 ~]# mysql -uroot -p12345678 -S /usr/local/mysql/tmp/mysql.sock
```

> 提示:服務器默認使用Socket方式連接數據庫。
### 1.3 實例介紹
#### 1.3.1 什么是實例
MySQL在啟動過程中會啟動后臺守護進程,并生成工作線程,預分配內存結構供MySQL處理數據使用,這些MySQL的后臺進程+線程+預分配的內存結構就是實例。

## MySQL的邏輯結構
### 2.1 mysqld服務器程序構成
msyqld服務程序分為三層,分別為連接層、SQL層、存儲引擎層:

#### 2.1.1 連接層
所包含的服務并不是MySQL所獨有的技術。它們都是服務于C/S程序或者是這些程序所需要的 :連接處理,身份驗證,安全性等等:

#### 2.1.2 SQL層
這是MySQL的核心部分,通常叫做 SQL Layer。在 MySQL據庫系統處理底層數據之前的所有工作都是在這一層完成的,包括權限判斷,sql解析,行計劃優化,query cache的處理以及所有內置的函數(如日期、時間、數學運算、加密)等等。各個存儲引擎提供的功能都集中在這一層,如存儲過程,觸發器,視圖等:

- SQL處理流程圖:

#### 2.1.3 存儲引擎層
通常叫做StorEngine Layer,也就是底層數據存取操作實現部分,由多種存儲引擎共同組成。它們負責存儲和獲取所有存儲在MySQL中的數據。就像Linux眾多的文件系統一樣。每個存儲引擎都有自己的優點和缺陷。服務器是通過存儲引擎API來與它們交互的。這個接口隱藏了各個存儲引擎不同的地方,對于查詢層盡可能的透明。這個API包含了很多底層的操作,如開始一個事務,或者取出有特定主鍵的行。存儲引擎不能解析SQL,互相之間也不能通信,僅僅是簡單的響應服務器 的請求:

### 2.2 SQL的整個處理過程

#### 2.2.1 Connectors
指的是不同語言中與SQL的交互。
#### 2.2.2 Management Serveices & Utilities:
系統管理和控制工具。
#### 2.2.3 Connection Pool: 連接池
管理緩沖用戶連接,線程處理等需要緩存的需求。負責監聽對 MySQL Server 的各種請求,接收連接請求,轉發所有連接請求到線程管理模塊。每一個連接上 MySQL Server 的客戶端請求都會被分配(或創建)一個連接線程為其單獨服務。而連接線程的主要工作就是負責 MySQL Server 與客戶端的通信,接受客戶端的命令請求,傳遞 Server 端的結果信息等。線程管理模塊則負責管理維護這些連接線程。包括線程的創建,線程的 cache 等。
#### 2.2.4 SQL Interface: SQL接口
接受用戶的SQL命令,并且返回用戶需要查詢的結果。比如select from就是調用SQL Interface。
#### 2.2.5 Parser: 解析器
SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的腳本。
在 MySQL中我們習慣將所有 Client 端發送給 Server 端的命令都稱為 query ,在 MySQL Server 里面,連接線程接收到客戶端的一個 Query 后,會直接將該 query 傳遞給專門負責將各種 Query 進行分類然后轉發給各個對應的處理模塊。
- 主要功能:
將SQL語句進行語義和語法的分析,分解成數據結構,然后按照不同的操作類型進行分類,然后做出針對性的轉發到后續步驟,以后SQL語句的傳遞和處理就是基于這個結構的。
如果在分解構成中遇到錯誤,那么就說明這個sql語句是不合理的
#### 2.2.6 Optimizer: 查詢優化器
SQL語句在查詢之前會使用查詢優化器對查詢進行優化。就是優化客戶端請求的 query(sql語句) ,根據客戶端請求的 query 語句,和數據庫中的一些統計信息,在一系列算法的基礎上進行分析,得出一個最優的策略,告訴后面的程序如何取得這個 query 語句的結果,他使用的是“選取-投影-聯接”策略進行查詢,用一個例子就可以理解:
```sql
select uid,name from user where gender = 1;
```
- 解析方式:
這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以后再進行gender過濾
這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以后再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果
#### 2.2.7 Cache和Buffer:查詢緩存
他的主要功能是將客戶端提交 給MySQL 的Select類query請求的返回結果集cache到內存中,與該query的一個hash值做一個對應。該Query所取數據的基表發生任何數據的變化之后,MySQL會自動使該query的Cache失效。在讀寫比例非常高的應用系統中,Query Cache對性能的提高是非常顯著的。當然它對內存的消耗也是非常大的。
如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。這個緩存機制是由一系列小緩存組成的:比如表緩存、記錄緩存、key緩存、權限緩存等
#### 2.2.8 存儲引擎接口
存儲引擎接口模塊可以說是MySQL數據庫中最有特色的一點了。目前各種數據庫產品中,基本上只有MySQL可以實現其底層數據存儲引擎的插件式管理。這個模塊實際上只是一個抽象類,但正是因為它成功地將各種數據處理高度抽象化,才成就了今天MySQL可插拔存儲引擎的特色。
從圖上還可以看出,MySQL區別于其他數據庫的最重要的特點就是其插件式的表存儲引擎。MySQL插件式的存儲引擎架構提供了一系列標準的管理和服務支持,這些標準與存儲引擎本身無關,可能是每個數據庫系統本身都必需的,如SQL分析器和優化器等,而存儲引擎是底層物理結構的實現,每個存儲引擎開發者都可以按照自己的意愿來進行開發。
注意:存儲引擎是基于表的,而不是數據庫。
### 2.3 存儲引擎概覽
存儲引擎是充當不同表類型的處理程序的服務器組件。依賴于存儲引擎的功能
#### 2.3.1 存儲引擎用于
- 存儲數據
- 檢索數據
- 通過索引查找數據
#### 2.3.2 雙層處理
- 上層包括SQL解析器和優化器
- 下層包含一組存儲引擎
#### 2.3.3 SQL層不依賴于存儲引擎
- 引擎不影響SQL處理
- 有一些例外
#### 2.3.4 依賴于存儲引擎的功能
- 存儲介質
- 事務功能
- 鎖定
- 備份和恢復
- 優化
- 特殊功能:如全文搜索、引用完整性、空間數據處理等
## MySQL“庫”的構成

### 3.1 數據庫的邏輯結構
#### 3.1.1 庫
```sql
show databases
use mysql
```
#### 3.1.2 表
```sql
show tables;
```
#### 3.1.3 記錄(行、列)
```sql
select user,host,password from user;
desc user
```
### 3.2 數據庫的物理結構
對象存儲中的庫相當于目錄。表分為MyIASM和InnoDB方式:
- MyIASM方式:
```text
[root@db02 ~]# ll -h /usr/local/mysql/data/mysql/user*
-rw-rw---- 1 mysql mysql 11K Nov 13 11:54 /usr/local/mysql/data/mysql/user.frm # 存放索引
-rw-rw---- 1 mysql mysql 488 Nov 13 12:33 /usr/local/mysql/data/mysql/user.MYD # 存放列結構
-rw-rw---- 1 mysql mysql 2.0K Nov 13 12:33 /usr/local/mysql/data/mysql/user.MYI # 存放行結構
```
InnoDB方式:
共享表空間:ibdata1:ibdata2
獨立表空間:t1.frm t1.ibd
- 創建一個數據庫和表,查看一下獨立表空間存儲的不同
```text
mysql> create database leon;
Query OK, 1 row affected (0.00 sec)
mysql> use leon;
Database changed
mysql> create table t1 (id int);
Query OK, 0 rows affected (0.63 sec)
mysql> insert into t1 values(1);
Query OK, 1 row affected (0.01 sec)
mysql> select id from t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
[root@db02 leon]# ll -h t1*
-rw-rw---- 1 mysql mysql 8.4K Nov 14 10:21 t1.frm # 存儲表結構定義
-rw-rw---- 1 mysql mysql 96K Nov 14 10:21 t1.ibd # 存儲行、列結構
```
### 3.3 MySQL使用磁盤方式

程序文件隨數據目錄一起存儲在服務器安裝目錄下。執行各種客戶機程序、管理程序和實用程序時將創建程序可執行文件和日志文件。首要使用磁盤空間的是數據目錄。
- 服務器日志文件和狀態文件:包含有關服務器處理的語句的信息。日志可用于進行故障排除、監視、復制和恢復。
- InnoDB 日志文件:(適用于所有數據庫)駐留在數據目錄級別。
- nnoDB 系統表空間:包含數據字典、撤消日志和緩沖區。
每個數據庫在數據目錄下均具有單一目錄(無論在數據庫中創建何種類型的表)。數據庫目錄存儲以下內容:
- 數據文件:特定于存儲引擎的數據文件。這些文件也可能包含元數據或索引信息,具體取決于所使用的存儲引擎。
- 格式文件 (.frm):包含每個表和/或視圖結構的說明,位于相應的數據庫目錄中。
- 觸發器:某個表關聯并在該表發生特定事件時激活的命名數據庫對象。
數據目錄的位置取決于配置、操作系統、安裝包和分發。典型位置是 /var/lib/mysql。MySQL在磁盤上存儲系統數據庫 (mysql)。mysql 包含諸如用戶、特權、插件、幫助列表、事件、時區實現和存儲例程之類的信息。
- 前言
- 讀者須知
- 第一章 Linux
- HTTP
- 簡介
- 狀態碼
- 特點
- URL
- Request
- Response
- 請求方式
- 工作原理
- 生命周期
- GET和POST區別
- 組成
- 端口
- 命令
- 常用命令
- chmod命令詳解
- ubuntu apt-get命令
- 用戶和用戶組
- Nginx
- 四個基本功能
- 進程
- 進程管理[ps命令]
- 進程管理[top命令]
- 進程管理[kill命令]
- 進程管理[進程優先級]
- 進程管理[netstat命令]
- 定時任務
- crontab
- 實現每秒執行
- >/dev/null 2>&1說明
- 文件管理
- 工作管理
- 資源管理
- 第二章 NGINX
- 介紹
- 入門
- 特性
- 安裝啟動
- 基礎必會
- 常用功能
- 反向代理
- 負載均衡
- 正向代理
- HTTP服務器
- 動靜分離
- 技能點匯總
- 顯示亂碼
- 打開目錄瀏覽功能
- 錯誤碼原因和解決方案
- location用法
- 常用正則
- rewrite
- 全局變量
- if語句塊
- https
- php后端處理(fast-cgi)
- flag標志位
- 過期功能
- gzip壓縮
- 會話保持時間
- 配置nginx worker進程最大打開文件數
- sendfile
- 單個工作進程的最大連接數
- 選擇事件驅動模型
- 隱藏ngxin版本號
- 網絡連接的優化
- 緩存原理及機制
- 限流
- 日志配置
- 灰度發布
- 配置一鍵生成
- 第三章 MySQL
- 入門
- 簡介
- 術語
- 特點
- 三范式
- 8.0 新特性
- 數據類型
- 數據類型詳解
- 常用函數
- 命令速查
- MyISAM與InnoDB區別
- 服務器構成
- 事務
- 本質
- 特性
- 分類
- 隔離級別
- PHP中使用事務實例
- MVCC
- 問題和解決
- 調優原則
- 分布式事務
- 索引
- 簡介
- 索引的分類
- 創建索引
- 刪除索引
- 哈希索引
- btree索引和hash索引的區別
- 單列索引和多列索引
- 索引優化
- 查看SQL語句對索引的使用情況
- 鎖
- 技能點
- 開發規范
- 導入導出數據庫
- blob和text的區別
- char與varchar類型區別
- SQL查詢語句優化
- 事務隔離和鎖操作需要在語言級別來做嗎
- 58到家數據庫30條軍規解讀
- 數據遷移
- SKU數據庫設計
- RBAC數據庫設計
- 第四章 Redis
- 入門
- 簡介
- 應用場景
- 安裝啟動
- 生命周期
- 事務
- 配置項
- 緩存
- 數據持久化
- 安全
- 數據類型
- string
- hash
- list
- set
- zset
- php代碼實戰
- 字符串緩存實戰
- 隊列實戰
- 發布訂閱實戰
- 計數器實戰
- 排行榜實戰
- 字符串悲觀鎖實戰
- 事務的樂觀鎖實戰
- 高級應用
- 分片機制
- 主從復制
- 緩存問題
- 解決 Redis 并發競爭 Key 問題
- 淘汰策略
- 第五章 PHP
- composer
- 什么是composer
- composer常用概念解析
- 使用composer的正確姿勢
- 消息隊列
- 為何使用消息隊列
- Beanstalkd
- PSR規范
- PSR-0
- PSR-1
- PSR-2
- PSR-3
- PSR-4
- OOP基礎
- 面向對象概念
- 類和對象
- 類
- 操作對象成員
- this使用
- 構造方法和析構方法
- 封裝
- __set(),__get(),__isset(),__unset()四個方法的應用
- 繼承
- 重載新的方法(parent::)
- 訪問類型(public,protected,private)
- final關鍵字的應用
- static和const關鍵字的使用(self::)
- static關鍵字
- __toString()方法
- 克隆對象__clone()方法
- __call()處理調用錯誤
- 抽象方法和抽象類(abstract)
- 接口(interface)
- 多態
- 把對象串行化serialize()方法,__sleep()方法,__wakeup()方法
- 自動加載類 __autoload()函數
- OOP進階
- 語法糖
- 異常處理
- 后期靜態綁定
- 后期靜態綁定在框架的運用
- 代碼優化思路
- Closure(閉包)
- 巧用PHP內置方法
- 數組操作的奇技淫巧
- 設計模式
- 單例模式(Singleton Pattern)
- 工廠模式(Factor Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)
- 適配器模式(Adapter Pattern)
- 裝飾器模式(Decorator Pattern)
- 代理模式(Proxy Pattern)
- 外觀模式(Facade Pattern)
- 橋接模式(Bridge Pattern)
- 組合模式(Composite Pattern)
- 享元模式 (Flyweight Pattern)
- 策略模式 ( Strategy Pattern )
- 模板模式 (Template Pattern)
- 觀察者模式 (observer Pattern)
- 迭代模式(Iterator Pattern)
- 責任鏈模式(Chain of Responsibility Pattern)
- 命令模式 (Command Pattern)
- 備忘錄模式(Memento Pattern)
- 狀態模式 (State Pattern)
- 訪問者模式(Visitor Pattern)
- 中介者模式(Mediator Pattern)
- 解釋器模式(Interpreter Pattern)
- 數據映射模式(Data Mapper Pattern)
- 注冊樹模式(Registry Pattern)
- 空對象模式(Null Object Pattern)
- 搜索引擎
- Elasticsearch
- 安裝
- 入門
- 實踐
- 集群
- 查詢
- API
- 接口調用
- cURL
- Guzzle
- RPC
- yar
- session
- 概念
- 客戶端實現形式
- cookie與session的區別
- Cookies的安全性
- JWT
- 組成
- 入門
- 應用
- 知識點
- 常見
- $_SERVER
- php的引用
- 第六章 技術棧擴展
- 使用第三方靜態資源服務
- 七牛對象存儲實戰
- 七牛對象存儲之客戶端上傳
- aliyunOSS服務端文件上傳
- aliyunOSS客戶端文件上傳
- 第三方支付
- 微信支付
- 支付寶支付
- SEO排名影響因素
- PHP架構師之路
- CTO職能
- web宏觀分析
- 常見的企業軟件系統
- 負載的優化思路
- 從容應對負載并發的前期準備
- 第七章 網絡安全
- XSS
- CSRF
- DDoS
- SQL注入
- 停用js
- 文件上傳
- 點擊劫持
- APT
- 會話劫持
- 第八章 運維
- devops
- devops簡介
- 常用工具
- 搭建運行環境
- Centos7 lnmp環境搭建
- ubuntu lnmp環境搭建
- Apache多站點配置
- docker
- 輕松使用和理解docker
- lnamp產品級環境搭建
- lnamp產品級環境搭建【第二版】
- 基于 Docker 容器的沙盒化評測系統
- vagrant
- vagrant入門
- vagrant之Vagrantfile
- vagrant之集成jenkins
- homestead
- gitlab
- gitlab簡介
- webhook
- ssh堡壘機
- 第九章 測試
- 壓力測試
- 單元測試
- 第十章 團隊協作
- 軟件開發模式
- 邊做邊改模型
- 瀑布模型
- 迭代模型
- 快速原型模型
- 增量模型
- 螺旋模型
- 敏捷軟件開發
- 演化模型
- 噴泉模型
- 智能模型
- 混合模型
- 模型對比
- TDD
- git
- git_入門
- git_使用
- git_進階
- git workflow
- git_高級
- git_小技巧
- okr工作法
- API接口文檔管理系統
- 敏捷協作工具
- 第十一章 技術燈塔
- github項目
- 社區好貨
- 紙質書
- 第十二章 代碼之外
- 面試官的角度看面試
- 程序員的壯年思考