一.客戶端與服務器模型

mysql
1.mysql是一個典型的C/S服務結構
1.1 mysql自帶的客戶端程序(/application/mysql/bin)
mysql
mysqladmin
mysqldump
1.2 mysqld一個二進制程序,後臺的守護進程
單進程
多線程redis
2.應用程鏈接MySQL方式
TCP/IP的鏈接方式

sql
套接字鏈接方式
緩存
思考:mysql -uroot -poldboy123是使用了哪一個鏈接方式???安全
二.MySQL服務器構成
1 什麼是實例
1.MySQL的後臺進程+線程+預分配的內存結構。
2.MySQL在啓動的過程當中會啓動後臺守護進程,並生成工做線程,預分配內存結構供MySQL處理數據使用。
![](http://static.javashuo.com/static/loading.gif)
圖1.1-word的打開方式

服務器
圖1.2-mysqld的打開方式多線程
2MySQLD服務器程序構成
![](http://static.javashuo.com/static/loading.gif)
mysqld是一個守護進程可是自己不能自主啓動:app
[root@db01 ~]# mysql -uroot -poldboy123
[root@db01 ~]# select user,host,password from mysql.user;
3 鏈接層
- 一、提供鏈接協議(socket、tcp/ip)
- 二、驗證用戶的合法性(用戶名、密碼、白名單)
- 三、提供一個專用鏈接線程(接收SQL、返回結果),將SQL語句交給SQL層繼續處理
![](http://static.javashuo.com/static/loading.gif)
4 SQL層
- 一、接收到SQL語句,語法判斷。
- 二、判斷語義(判斷語句類型:DML、DDL、DCL、DQL)
- 三、解析SQL語句,生成多種執行計劃
- 四、優化器,選擇他認爲成本最低的執行計劃。
- 五、執行器根據優化器的選擇,按照優化器建議執行SQL語句,獲得去哪兒找SQL語句須要訪問的數據
5.1 具體:在哪一個數據文件上的哪一個數據頁中?
5.2 將以上結果充送給下層繼續處理
- 六、接收存儲引擎層的數據,結構化成表的形式,經過鏈接層提供的專用線程,將表數據返回給用戶。
- 七、提供查詢緩存
7.1 query_cache, 使用memcache 或者redis 替代
- 八、日誌記錄(binlog)
5 存儲引擎層
- 一、接收上層的執行結果
- 二、取出磁盤文件和相應數據
- 三、返回給SQL層,結構化以後生成表格,由專用線程返回給客戶端
三.MySQL的結構
1 MySQL的邏輯結構(熟悉)
MySQL的邏輯對象:作爲管理人員或者開發人員操做的對象socket
- 一、庫
- 二、表:元數據+真實數據行
- 三、元數據:列+其它屬性(行數+佔用空間大小+權限)
- 四、列:列名字+數據類型+其餘約束(非空、惟1、主鍵、非負數、自增加、默認值)
最直觀的數據:二維表,必須用庫來存放
![](http://static.javashuo.com/static/loading.gif)
MySQL邏輯結構與Linux系統對比tcp
庫 |
目錄 |
show databases; |
ls-l / |
use mysql |
cd /mysql |
表 |
文件 |
show tables; |
ls |
二維表=元數據+真實數據行 |
文件=文件名+文件屬性 |
2 MySQL的物理結構(瞭解)
1)MySQL的最底層的物理結構是數據文件,也就是說,存儲引擎層,打交道的文件,是數據文件。
2)存儲引擎分爲不少種類(Linux中的FS)
3)不一樣存儲引擎的區別:存儲方式、安全性、性能
myisam:
![](http://static.javashuo.com/static/loading.gif)
innodb:
![](http://static.javashuo.com/static/loading.gif)
3 段、區、頁(塊)
- 一、段:理論上一個表就是一個段,由多個區構成,(分區表是一個分區一個段)
- 二、區:連續的多個頁構成
- 三、頁:最小的數據存儲單元,默認是16k