1 C/S 模型
兩種連接方式:
TCP/IP:mysql -u root -h 10.0.0.1 -P 3306 -p
Socket:mysql -u root -S /tmp/mysql.sock
2 實例的組成
實例指的是一個躺在磁盤上的程序文件運行在後臺,叫做一個實例。實例的組成分為:
mysqld 啟動進程
master thread
child thread
memory 預分配的內存
3 mysql架構
用戶連接請求-->連接層-->sql層-->存儲引擎層
連接層
1 提供tcp socket協議連接。為了能夠讓用戶連接上數據庫,必須提供必要的連接協議。
2 校驗用戶合法性,進行匹配專門的授權表
3 連接成功,會生成一個對應的線程,保持連接,通過show processlist可以查看到,這個連接負責接收sql語句以及返回執行結果
sql層
1 校驗sql語句的語法以及SQL_MODE
2 校驗sql語句的語義,檢查權限
3 解析sql語句,生成執行計劃樹
4 優化器(根據算法找到代價最低的執行計劃)
5 執行器按照計劃執行sql語句,得出獲取數據的方法
6 提供query cache(默認關閉),一般使用redis
7 記錄操作日誌(binlog) 默認關閉
存儲引擎層
根據sql層提供的方法拿到數據,返回給sql層,sql層結構化成表,再通過連接層返回給用戶
4 mysql存儲結構
邏輯存儲結構
庫 ----》Linux目錄
create database wordpress charset utf8mb4; ----》mkdir /wordpress
show databases; ----》ls /
use wordpress; ----》cd /wordpress
表 ----》Linux的文件
列(字段) 無
列屬性 無
數據行(記錄) ----》Linux數據行
表屬性(元數據) ----》Linux 文件屬性
mysql物理存儲結構
庫: 使用FS上的目錄來表示
表:
MyISAM(ext2)
user.frm : 存儲的表結構(列,列屬性)
user.MYD : 存儲的數據記錄
user.MYI : 存儲索引
InnoDB(XFS)
time_zone.frm : 存儲的表結構(列,列屬性)
time_zone.ibd : 存儲的數據記錄和索引
ibdata1 : 數據字典信息 //類型inode
innodb 段 區 頁
一般情況下(非分區表)
一個表就是一個段
一個段由多個區構成
一個區在(16k),64個連續的頁,1M大小
5 數據庫產品
RDBMS:二維表,有嚴格的行列結構及屬性約束,支持更加複雜的查詢
mysql,oracle,mairadb,pg
NOSQL:沒有嚴格的行列結構,可伸縮性,可擴展性高。
redis: 鍵值數據庫就像在傳統語言中使用的哈希表。你可以通過key來添加、查詢或者刪除數據,鑑於使用主鍵訪問,所以會獲得不錯的性能及擴展性。
mongodb:基於document, 面向文檔數據庫會將數據以文檔的形式儲存。每個文檔都是自包含的數據單元,是一系列數據項的集合。每個數據項都有一個名稱與對應的值,值既可以是簡單的數據類型,如字符串、數字和日期等;也可以是複雜的類型,如有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的,數據可以使用XML、JSON或者JSONB等多種形式存儲。
wide column: 列存儲數據庫將數據儲存在列族(column family)中,一個列族存儲經常被一起查詢的相關數據。舉個例子,如果我們有一個Person類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。
NEWSQL:分佈式數據庫
閱讀更多 雨小白的python之路 的文章