新手入門Mysql–概念
1. 是什麼?
MySQL 是最流行的關系型數據庫管理系統,在 WEB 應用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關系數據庫管理系統)應用軟件之一。
1.1 RDBMS
RDBMS 即關系數據庫管理系統(Relational Database Management System)的特點:
1.數據以表格的形式出現
2.每行為各種記錄名稱
3.每列為記錄名稱所對應的數據域
4.許多的行和列組成一張表單
5.若幹的表單組成database
1.2 MySQL數據庫
MySQL 是一個關系型數據庫管理系統,由瑞典 MySQL AB 公司開發,目前屬於 Oracle 公司。MySQL 是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加瞭速度並提高瞭靈活性。
- MySQL 是開源的,目前隸屬於 Oracle 旗下產品。
- MySQL 支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
- MySQL 使用標準的 SQL 數據語言形式。
- MySQL 可以運行於多個系統上,並且支持多種語言。這些編程語言包括 C、C++、Python、Java、 Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 對PHP有很好的支持,PHP 是目前最流行的 Web 開發語言。
- MySQL 支持大型數據庫,支持 5000 萬條記錄的數據倉庫,32 位系統表文件最大可支持 4GB,64 位系統支持最大的表文件為8TB。
- MySQL 是可以定制的,采用瞭 GPL 協議,你可以修改源碼來開發自己的 MySQL 系統。
2. 工作機制
2.1 整體架構圖(C/S架構)
- Client :
提供連接MySQL服務器功能的常用工具集
- Server :
MySQL實例,真正提供數據存儲和數據處理功能的MySQL服務器進程
- mysqld:
MySQL服務器守護程序,在後臺運行。它管理著客戶端請求。mysqld是一個多線程的進程,允許多個會話連接,端口監聽連接,管理MySQL實例
- MySQL memory allocation:
MySQL的要求的內存空間是動態的,比如 innodb_buffer_pool_size (from 5.7.5), key_buffer_size。每個會話都有獨一無二的執行計劃,我們隻能共享同一會話域內的數據集。
- SESSION
為每個客戶端連接分配一個會話,動態分配和回收。用於查詢處理,每個會話同時具備一個緩沖區。每個會話是作為一個線程執行的
- Parser
檢測SQL語句語法,為每條SQL語句生成SQL_ID,用戶認證也發生在這個階段
- Optimizer
創造一個有效率的執行計劃(根據具體的存儲引擎)。它將會重寫查詢語句。比如:InnoDB有共享緩沖區,所以,優化器會首先從預先緩存的數據中提取。使用 table statistics optimizer將會為SQL查詢生成一個執行計劃。用戶權限檢查也發生在這個階段。
- Metadata cache
緩存對象元信息和統計信息
- Query cache
共享在內存中的完全一樣的查詢語句。如果完全相同的查詢在緩存命中,MySQL服務器會直接從緩存中去檢索結果。緩存是會話間共享的,所以為一個客戶生成的結果集也能為另一個客戶所用。查詢緩存基於SQL_ID。將SELECT語句寫入視圖就是查詢緩存最好的例子。
- key cache
緩存表索引。MySQL keys是索引。如果索引數據量小,它將緩存索引結構和葉子節點(存儲索引數據)。如果索引很大,它隻會緩存索引結構,通常供MyISAM存儲引擎使用
2.2 網絡協議
2.2.1 通信協議
到MySQL5.7為止,總共有五種,分別是TCP/IP,TLS/SSL,Unix Sockets,Shared Memory,Named pipes,下面我們就來看看這五種的區別:
方式 | 默認開啟 | 支持系統 | 隻支持本機 | 如何開啟 | 參數配置 |
---|---|---|---|---|---|
TCP/IP | 是 | 所有系統 | 否 | –skip-networking=yes/no | –port–bind-address |
TLS/SSL | 是 | 所有系統(基於TCP/IP)之上 | 否 | –ssl=yes/no | –ssl-* options |
Unix Sockets | 是 | 類Unix系統 | 是 | –socket= 來關閉 | –socket=socket path |
Shared Memory | 否 | Windows系統 | 是 | –shared-memory=on/off. | –shared-memory-base-name= |
Named pipes | 否 | Windows系統 | 否 | –enable-named-pipe=on/off | –socket= |
2.2.2 報文格式
協議頭:
每個協議頭共4個字節
– 包數據長度:
前三個字節表示數據部分的長度(不包括協議頭),三字節能表示的最大長度是16M-1(2^24 – 1),如果要發送的數據部分大於這個長度,要進行拆包,每16M-1個長度為一包。接收端在接受數據的時候,如果檢測到包的長度是16M-1,說明後續還有數據部分,直到接收到<16M-1長度的數據包結束。這意味著最後一包的數據長度可能為0.
序號:
1個字節,從0開始遞增。當發送一個新的sql、數據庫重連,該值清0(函數sql/Net_serv.cc : net_clear).
數據類型:
除瞭固定長度的整型或者字符串之外,還有其他幾種類型的數據。(固定長度字段數據的存取:include/Mybyte_order.h : 存值 intstore 取值:intkorr 多字節的處理按照小端優先的方式)
1. 可變長度的整數 對該類數據的存取在函數:sql-common/Pack.c: 存整數: net_store_length 讀整數:net_field_length 如果數值<251,直接用一個字節存儲這個值。 如果251<=數值<2^16, 采用3個字節存儲,第一個字節是252, 另外2個字節存儲整數內容 如果2^16<=數值<2^24,采用4字節存儲,第一個字節是252,另外3個字節存儲整數內容 如果2^24<=數值<2^64,采用9字節存儲,第一個字節255,另外8字節存儲整數內容 如果第一個字節為251,表示該整數字段為null 如果第一個字節為255,表示該字節是ERR包的第一個字節 2. 可編碼長度的字符串 字符串的長度采用可變長度的整數進行編碼。
2.3 SQL語法
可以把 SQL 分為兩個部分:數據操作語言 (DML) 和 數據定義語言 (DDL)。 SQL (結構化查詢語言)是用於執行查詢的語法。但是 SQL 語言也包含用於更新、插入和刪除記錄的語法。
查詢和更新指令構成瞭 SQL 的 DML 部分:
SELECT – 從數據庫表中獲取數據UPDATE – 更新數據庫表中的數據DELETE – 從數據庫表中刪除數據INSERT INTO – 向數據庫表中插入數據SQL 的數據定義語言 (DDL) 部分使我們有能力創建或刪除表格。我們也可以定義索引(鍵),規定表之間的鏈接,以及施加表間的約束。
SQL 中最重要的 DDL 語句:
CREATE DATABASE – 創建新數據庫ALTER DATABASE – 修改數據庫CREATE TABLE – 創建新表ALTER TABLE – 變更(改變)數據庫表DROP TABLE – 刪除表CREATE INDEX – 創建索引(搜索鍵)DROP INDEX – 刪除索引
3. 小結
這篇文章從宏觀和使用角度去瞭解Mysql是什麼,後續深入。也請大傢多多關註WalkonNet的更多內容