一、初識mysql
1、mysql數據庫實例:運行mysql服務器程序的進程
2、啟動mysql客戶端程序,參數-h 計算機的ip地址,-u用戶名,-p密碼
3、客戶端和服務器連接過程,客戶端進程向服務器進程發送請求並得到響應的過程本質上是進程之間的通信
3.1TCP/IP mysql服務器在啟動時會默認申請3306端口號,可以通過啟動服務器進程的命令行添加-P參數來指定端口號
3.2 命名管道 啟動服務器命令行加上--enable-named-pipe 在客戶端加上--protocol=pipe
3.3 共享內存 啟動服務器命令行加上--shared-memory 在客戶端加上--protocol==memory
4、服務器處理客戶端請求(客戶端向服務器發送文本mysql語句,服務器向客戶端返回結果)
4.1 連接管理:當有一個客戶端進程連接到服務器時,服務器都會創建一個線程與它打交道,當該客戶端退出時,服務器並不會立即將線程銷毀,而是將它緩存起來,當有新的客戶端時,就把緩存分配給它,節省了開銷,
4.2 解析和優化
4.2.1 查詢緩存:服務器會把剛剛處理的查詢請求和結果緩存起來,如果有相同的請求 直接從緩存中取。查詢緩存會在不同的客戶端之間共享,只要修改了表,與 表相關的緩存都會被刪除
4.2.2 語法解析:如果換粗沒有命中,mysql服務器對文本進行分析,判斷語法是否正確。
4.2.3 查詢優化
4.3 存儲引擎:物理上怎么表示記錄,怎么從表中讀取數據,怎么把數據寫在物理存儲器上
常見操作:
(1)服務器支持的引擎: show engines
(2)創建表時 設置存儲引擎 create table 表名() engine=InnoDB
(3)修改表存儲引擎 alter table 表明 engine=MyISAM
二、mysql啟動選項和系統變量
1、在命令行使用選項
1)--skip--networking 禁止使用TCP/IP網絡進行通信
2)--default-storage-engine=MyISAM
2、配置文件中使用選項
windows配置文件路徑:BASEDIR\my.ini
可以通過--default-extra-file指定額外的配置文件路徑
配置文件以[ ]為一個組 例如
[server]
option1
option2=value2
3、系統變量
查看系統變量 show variables like
通過啟動選項設置系統變量 --max-connection
服務器程序運行過程中設置
global:影響服務器的整體操作
session:影響某個客戶端連接的操作
set [global|session] 系統變量名=值
4、狀態變量
查看狀態變量語句show status like
三、字符集和比較規則
1、字符集:描述某個字符范圍的編碼規則
2、常用的字符集
1)ASCII 1個字節
2)gbk 2個字節
3)utf8 3個字節
4)utf8mb3 4個字節 默認的
3、字符集的級別和比較規則
1)服務器級別:可以在配置文件[server]中修改
character_set_server:服務器級別的字符集
collation_server:服務器級別的比較規則
2)數據庫級別:create database [character set 字符集名稱][collate 比較規則名稱]
character_set_database:數據庫的字符集
collation_database:數據庫的比較規則
3)表級別:create table [character set 字符集名稱][collate 比較規則名稱]
4) 列級別:create table 表名(列名 字符串類型 [character set 字符集名稱][collate 比較規則名稱]) alter table 表名 modify 列名 字符串類型 [character set 字符集名稱][collate 比較規則名稱]
4、各字符集和比較規則
如果創建或修改列時沒有顯式指定字符集和比較規則,則列默認使用表的字符集和比較規則
如果創建或修改表時沒有顯式指定字符集和比較規則,則列默認使用數據庫的字符集和比較規則
如果創建或修改數據庫時沒有顯式指定字符集和比較規則,則列默認使用服務器的字符集和比較規則
5、客戶端和服務器通信過程中使用的字符集
1)客戶端發送的請求字節序列是采用哪種字符集進行編碼的。這一步驟主要取決於操作系統當前使用的字符集,與default-character-set啟動選項有關
2)服務器收到請求字節序列后會認為它是采用哪種字符集進行編碼的。這一步驟主要取決於系統變量character_set_client
3)服務器在運行過程中會把請求的字節序列轉換為以哪種字符集編碼的字節序列。這一步驟主要取決於系統變量 character_set_connection
4)服務器在向客戶端返回字節序列時,是采用哪種字符集編碼的。這一步驟取決於系統變量character_set_results的值
5)客戶端在收到響應字節后,是怎么把它們寫到黑框的,主要取決於操作系統使用的字符集
四、InnoDB記錄存儲結構
1、InnoDB是一個將表中的數據存儲到磁盤上的存儲引擎,它將數據划分成若干頁,以頁作為磁盤和內存之間交互的基本單位,頁的大小一般划分成16kb
2、InnoDB行格式 :compact redundant dynamic compressed
3、指定行格式:
create table 表名 (列名)row_format=行格式名稱
alter table 表名 row_format=行格式名稱
4、 記錄的額外信息 記錄的真實數據
變長字段長度列表 | NULL值列表 | 記錄頭信息 | 列1的值 | 列2的值 | …… | 列n的值 |
5、記錄的額外信息
1)變長字段長度列表:各變長字段的真實數據占用的字節數按照列的逆序順序存放
2)NULL值列表:用一個二進制位表示是否為null(逆序)
3)記錄頭信息:用5個字節表示
6、記錄的真實數據
隱藏列:row_id 行id 唯一標識一條記錄 trx_id:事務id roll_pointer:回滾指針
主鍵生成策略:1、用戶自定義 2、不允許為NULL的unique鍵 3、隱藏列的row_id
7、char(M)的存儲策略:當列采用的是定長編碼的字符集時,該列的字節數不會被加到變長字段列表。而采用變長編碼的字符集時,會被加到變長字段列表
五 InnoDB索引頁(數據頁)結構
1、數據頁結構
1)File Header 2)Page Header 3)Infimum+Supremum 4)User Records 5)Free Space 6)Page Directory 7)File Tailer
2、記錄在頁中的存儲:每插入一條記錄時,都會從Free Space部分申請一個記錄大小的空間,並將這個空間划分到User Records部分
3、User Records的記錄頭信息部分
名稱 | 大小 | 描述 |
預留位1 | 1 | 未使用 |
預留位2 | 1 | 未使用 |
deleted_flag | 1 | 標記該記錄是否被刪除 |
min_rec_flag | 1 | B+樹每層非葉子結點中的最小的記錄項記錄會被添加該標記 |
n_owned | 4 | 一個頁面的記錄會被分成若干組,每個組有一個記錄是帶頭大哥,其余的都是小弟。帶頭大哥記錄n_owned,小弟記錄的n_owned值都為0 |
heap_no | 13 | 表示當前記錄在頁面堆中的相對位置 |
record_type | 3 | 表示當前記錄的類型,0表示普通記錄,1表示B+樹非葉節點的目錄項記錄,2表示Infimum記錄,3表示Supremum記錄 |
next_record | 16 | 下一條記錄的相對位置 |
4、delete_flag:標記當前記錄是否被刪除,刪除的記錄還會在頁中,所有被刪掉的記錄會形成一個垃圾列表,記錄在這個列表中占用的空間稱為可重用空間
5、heap_no:將記錄排列的結構稱為堆,頁前面的記錄heap_no較小,后面的較大。infimum的heap_no為0。supremum的heap_no為1。Infimum記錄是頁面中最小的記錄。Supremumu記錄是頁面中最大的記錄。
6、record_type:0表示普通記錄 1表示B+樹非葉節點的目錄項記錄 2表示Infimum 3表示supremum
7、next_record:表示從當前記錄的真實數據到下一條記錄的真實數據的距離,箭頭指向真實數據開始的地方。
無論怎么對頁中的記錄進行增刪改操作,InnoDB始終會維護記錄的一個單向列表,鏈表的各個節點按照主鍵值由小到大順序連接起來
8、頁目錄:頁目錄由槽slot組成,槽是每個組的帶頭大哥的地址偏移量組成。地址偏移量是該記錄的真實數據與頁面中第0個字節之間的距離
在數據頁查找指定主鍵的記錄時,過程為:
(1)通過二分法確定該記錄所在分組對應的槽,然后找到該槽所在分組中主鍵值最小的記錄
(2)通過next_record屬性遍歷該槽所在的組中的各個記錄
9、File Header都有上一個頁和下一個頁的編號,所有的數據頁會組成一個雙向鏈表