🐇明明跟你說過:個人主頁
🏅個人專欄:《MySQL技術精粹》🏅
🔖行路有良友,便是天堂🔖
目錄
一、引言
1、什么是MySQL
2、MySQL適用場景
二、MySQL的數據存儲與檢索
1、數據表設計
1.1?什么是數據表
1.2?如何設計數據表
2、索引設計
2.1 什么是索引
2.2 為什么需要索引
2.3 索引的基本類型
3.4 如何選擇合適的索引
3、數據類型
3.1 數值類型
3.2 字符串類型
3.3 日期和時間類型
4、存儲格式
4.1 存儲引擎 (Storage Engines)
4.2 表的存儲格式
4.3 MySQL 數據存儲的物理結構
一、引言
1、什么是MySQL
MySQL 是一個開源的關系型數據庫管理系統(RDBMS),基于 SQL(結構化查詢語言)來管理數據庫中的數據。它是最流行的數據庫管理系統之一,廣泛應用于各類 Web 應用程序和軟件系統中,尤其是在 LAMP(Linux、Apache、MySQL、PHP/Perl/Python)堆棧中扮演著核心角色。
2、MySQL適用場景
1. Web應用開發
MySQL 最常用于 Web 應用程序的后臺數據庫,尤其是在 LAMP(Linux、Apache、MySQL、PHP/Python/Perl)或 MERN(MongoDB、Express.js、React、Node.js)架構中,MySQL 作為數據庫解決方案廣泛應用于:
- 內容管理系統(CMS):如 WordPress、Drupal、Joomla 等,通常使用 MySQL 存儲文章、用戶、評論等數據。
- 電子商務平臺:如 Magento、PrestaShop 和 OpenCart 等,MySQL 用于存儲產品目錄、訂單數據、用戶信息等。
- 社交媒體應用:MySQL 可以存儲用戶數據、朋友關系、帖子、評論等信息。
- 在線論壇與博客:如 Discourse、phpBB 等,MySQL 可以管理帖子、用戶賬戶、評論等內容。
2. 內容管理與發布系統
MySQL 廣泛用于內容管理系統(CMS),如 WordPress、Drupal 和 Joomla。它存儲網站的內容(文章、圖片、視頻、評論、用戶信息等)以及管理用戶權限和訪問控制的元數據。MySQL 在這些系統中的高效查詢和可擴展性使其成為理想選擇。
3. 電子商務系統
電子商務平臺(如 Magento、WooCommerce、PrestaShop)依賴于 MySQL 來存儲產品、訂單、客戶、支付、庫存等信息。MySQL 支持高并發的查詢和交易,確保訂單處理的快速響應。它的事務處理特性確保了訂單數據的一致性和完整性。
二、MySQL的數據存儲與檢索
1、數據表設計
1.1?什么是數據表
在 MySQL 中,數據表是用來存儲數據的結構。可以將數據表想象成一個 Excel 表格,每一行代表一條記錄,每一列代表一個數據字段(屬性)。比如,一個存儲用戶信息的表,可能有字段:用戶ID、用戶名、電子郵箱、創建時間等。
1.2?如何設計數據表
設計數據表時,我們需要考慮以下幾個重要方面:
字段(列)的選擇
每個數據表都會有多個字段。字段是表中數據的屬性,決定了你能存儲什么樣的數據。舉個例子:
假設你要設計一個存儲“用戶信息”的數據表,可能會有以下字段:
- user_id:用戶的唯一標識符(整數型)。
- username:用戶名(字符串類型)。
- email:電子郵件地址(字符串類型)。
- created_at:賬號創建時間(日期時間類型)。
每個字段都有對應的數據類型,比如 INT 表示整數,VARCHAR 表示可變長度的字符串,DATETIME 表示日期時間等。選擇正確的數據類型可以節省存儲空間,提升查詢效率。
主鍵(Primary Key)
主鍵是數據表中唯一標識一行數據的字段,它的值不能重復,不能為空。每個數據表應該有一個主鍵。通常我們用“自增ID”作為主鍵,它會自動為每一條記錄分配一個唯一的 ID。
比如,user_id 字段可以作為 users 表的主鍵。它保證了每個用戶在表中都有一個唯一標識。
外鍵(Foreign Key)
外鍵是用來在兩個數據表之間建立關聯的字段。它是一個數據表中的字段,指向另一個數據表的主鍵。外鍵可以幫助保持數據一致性,確保關聯的記錄始終有效。
舉個例子,如果有一個“訂單”表和“用戶”表,訂單表中可能包含一個 user_id 字段,用來表示訂單屬于哪個用戶。這個 user_id 字段就是外鍵,它指向“用戶”表中的主鍵 user_id。
數據規范化(Normalization)
數據規范化是指通過合理地劃分數據表來減少冗余數據,并確保數據一致性。常見的規范化范式有:
- 第一范式(1NF):保證每列的數據都是原子性的,即每個字段只能包含一個值。
- 第二范式(2NF):在滿足 1NF 的基礎上,保證每個非主鍵字段完全依賴于主鍵字段。
- 第三范式(3NF):在滿足 2NF 的基礎上,確保沒有非主鍵字段依賴于其他非主鍵字段。
例如,假設你有一個包含用戶信息的表,字段包括 user_id、username、email、city(用戶城市)等。如果你將所有用戶信息存儲在一個表中,就可能出現冗余。例如,許多用戶都在同一個城市,這樣會導致城市名重復出現。為了減少冗余,可以將“城市”單獨放到另一個表中,建立一個與用戶表的關聯。
2、索引設計
2.1 什么是索引
可以把索引理解為一本書的“目錄”。當你想要找到書中的某一章或某一節內容時,你不需要從頭到尾閱讀每一頁,而是可以直接查閱目錄,快速定位到需要的地方。
在 MySQL 中,索引就是為了加速查詢操作,幫助數據庫更快速地找到需要的數據。沒有索引,數據庫就需要逐行掃描(全表掃描)來查找數據,這會非常慢。
2.2 為什么需要索引
數據庫在存儲大量數據時,查詢效率可能會非常低。比如,有一個包含數百萬行數據的表,如果每次查詢都要掃描整個表,那就會非常浪費時間和資源。
通過為數據表創建索引,MySQL 可以通過查找索引來直接定位到相關記錄,而不必掃描整個表。這樣可以顯著提升查詢性能。
2.3 索引的基本類型
MySQL 支持幾種常見的索引類型,每種類型有不同的使用場景。
單列索引
單列索引是最常見的一種索引類型,它為表中的一個字段創建索引。比如,如果你經常按 email 字段查詢用戶信息,可以為 email 字段創建單列索引。
CREATE INDEX idx_email ON users(email);
這種索引只會加速基于單個字段的查詢。
復合索引(多列索引)
復合索引是由多個字段組成的索引。當你經常用多個字段一起進行查詢時,可以為這些字段創建復合索引。比如,如果你經常根據 username 和 email 兩個字段同時查詢用戶信息,可以創建復合索引。
CREATE INDEX idx_username_email ON users(username, email);
復合索引的順序非常重要。它會根據索引字段的順序來優化查詢。如果你經常查詢 username 和 email,那么這個復合索引會非常有效。但如果查詢條件只包含 email,而沒有 username,這個索引的效果就不好。
唯一索引
唯一索引保證了列中每個值的唯一性。一般來說,主鍵就是唯一索引。如果你想確保某個字段的值不能重復,可以使用唯一索引。
CREATE UNIQUE INDEX idx_unique_email ON users(email);
這樣,email 字段就無法插入重復的值。
全文索引
全文索引(FULLTEXT)用于加速對文本數據的搜索,尤其是對于大文本字段(如文章、評論等)。它允許對文本中的單詞進行快速搜索。全文索引適用于搜索操作,而不是精確匹配。
CREATE FULLTEXT INDEX idx_fulltext_content ON articles(content);
3.4 如何選擇合適的索引
索引并不是越多越好,過多的索引會導致數據庫在執行插入、刪除和更新操作時變得更慢。所以,在設計索引時,需要根據查詢的實際需求來選擇合適的索引。
查詢頻繁的字段
- 為那些在查詢中經常作為條件的字段創建索引。例如,如果你經常根據 email 來查找用戶,就可以為 email 創建索引。
復合索引
- 如果查詢經常使用多個字段的組合(比如 username 和 email),可以考慮創建復合索引,而不是為每個字段單獨創建索引。
避免冗余索引
- 如果已經有復合索引包含了某個字段,就不需要為該字段單獨創建索引了。否則,索引會變得冗余,影響性能。
3、數據類型
3.1 數值類型
數值類型用于存儲整數和浮動小數點的數字。MySQL 提供了多種數值類型,主要分為整數類型、浮動小數點類型和定點數類型。
整數類型
整數類型用于存儲沒有小數部分的數字。常見的整數類型包括:
- TINYINT: 范圍為 -128 到 127(有符號)或 0 到 255(無符號)。用于存儲非常小的整數。
- SMALLINT: 范圍為 -32,768 到 32,767(有符號)或 0 到 65,535(無符號)。
- MEDIUMINT: 范圍為 -8,388,608 到 8,388,607(有符號)或 0 到 16,777,215(無符號)。
- INT(或 INTEGER): 范圍為 -2,147,483,648 到 2,147,483,647(有符號)或 0 到 4,294,967,295(無符號)。這是最常用的整數類型。
- BIGINT: 范圍為 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(有符號)或 0 到 18,446,744,073,709,551,615(無符號)。用于存儲非常大的整數。
浮動小數點類型
浮動小數點類型用于存儲帶有小數部分的數值。常見的浮動小數點類型有:
- FLOAT: 單精度浮點數。存儲的數值精度較低,適合存儲占用空間較小的數值。其精度為 7 位十進制數。
- DOUBLE: 雙精度浮點數,精度更高,適合存儲需要高精度的數值。其精度為 15 位十進制數。
- REAL: 實際上是 DOUBLE 類型的別名。
3.2 字符串類型
字符串類型用于存儲各種文本數據,MySQL 提供了多種類型的字符串字段。
字符類型
- CHAR(M): 固定長度的字符串,M 表示字符的長度,最大可達 255 字符。即使插入的字符串長度小于 M,它也會用空格填充至指定的長度。
- VARCHAR(M): 可變長度的字符串,M 表示最大字符長度,最大值為 65,535 字符。VARCHAR 根據實際存儲的字符長度來分配空間,不會浪費空間。
- TEXT: 用于存儲大文本數據,最大長度為 65,535 字符。TEXT 類型用于存儲超過 VARCHAR 能存儲的字符串,通常用于存儲長文本內容。
- TINYTEXT: 最大長度為 255 字符的文本。
- MEDIUMTEXT: 最大長度為 16,777,215 字符的文本。
- LONGTEXT: 最大長度為 4,294,967,295 字符的文本。
二進制數據類型
二進制數據類型用于存儲原始二進制數據,如圖像、文件等。
- BINARY(M): 固定長度的二進制數據,M 表示長度,最大可達 255 字節。
- VARBINARY(M): 可變長度的二進制數據,M 表示最大字節數,最大為 65,535 字節。
- BLOB: 用于存儲大塊二進制數據,最大為 65,535 字節。BLOB 與 TEXT 類似,但用于二進制數據。
- TINYBLOB: 最大為 255 字節的二進制數據。
- MEDIUMBLOB: 最大為 16,777,215 字節的二進制數據。
- LONGBLOB: 最大為 4,294,967,295 字節的二進制數據。
3.3 日期和時間類型
日期和時間類型用于存儲日期和時間信息,MySQL 提供了多種類型來表示不同的日期和時間。
- DATE: 用于存儲日期,格式為 YYYY-MM-DD,范圍是 1000-01-01 到 9999-12-31。
- DATETIME: 用于存儲日期和時間,格式為 YYYY-MM-DD HH:MM:SS,范圍是 1000-01-01 00:00:00 到 9999-12-31 23:59:59。
- TIMESTAMP: 用于存儲時間戳,表示從 1970-01-01 00:00:00 UTC 到當前時間的秒數。通常用于記錄數據的創建或修改時間。范圍是 1970-01-01 00:00:01 到 2038-01-19 03:14:07。
- TIME: 用于存儲時間,格式為 HH:MM:SS,范圍是 -838:59:59 到 838:59:59。
- YEAR: 用于存儲年份,格式為 YYYY,范圍是 1901 到 2155。
4、存儲格式
4.1 存儲引擎 (Storage Engines)
MySQL 支持多種存儲引擎,每種引擎有不同的數據存儲格式和特性。常見的存儲引擎有:
InnoDB(默認存儲引擎)
- 事務支持:InnoDB 是 MySQL 默認的存儲引擎,支持事務、ACID(原子性、一致性、隔離性、持久性)特性。
- 行級鎖定:InnoDB 支持行級鎖定,提高并發性能。
- 數據存儲格式:InnoDB 使用聚集索引(Clustered Index)來存儲數據。數據表中的數據是按主鍵順序存儲的,因此主鍵的選擇對性能有重要影響。
- 數據文件:InnoDB 數據存儲在 ibdata 文件中(默認情況下),此外還有每個表的獨立表空間文件(.ibd 文件)用于存儲表和索引數據。
- 表的存儲格式:每個 InnoDB 表都有自己的表空間文件。數據和索引存儲在一個單獨的文件中,這個文件包含了該表的所有信息。
MyISAM
- 不支持事務:MyISAM 不支持事務,不提供 ACID 保證,但由于其簡單性和高效性,通常適用于讀多寫少的應用場景。
- 表級鎖定:MyISAM 使用表級鎖定,適用于并發性較低的情況,多個查詢可以共享鎖,但對寫操作會造成阻塞。
- 數據存儲格式:MyISAM 使用的是非聚集索引的存儲格式。數據和索引分別存儲在不同的文件中:數據存儲在 .MYD 文件中,索引存儲在 .MYI 文件中。
- 存儲效率:MyISAM 通常比 InnoDB 存儲效率高,但不適用于對事務和并發要求較高的場景。
MEMORY
- 內存存儲:MEMORY 引擎將所有數據存儲在內存中,因此它提供非常快速的讀寫操作。但因為數據存儲在內存中,系統重啟后數據將丟失。
- 數據存儲格式:數據表存儲在內存中,類似于臨時表。數據文件實際上存在于 RAM 中,不會被寫入磁盤。
- 適用場景:適用于存儲臨時數據或需要高速讀寫的操作,比如緩存。
CSV
- 以逗號分隔的文件:CSV 存儲引擎將每個表的數據存儲為一個以逗號分隔值的文本文件,每行代表一條記錄。
- 適用場景:適用于需要將數據導入或導出為 CSV 格式的應用場景。它不適用于高效查詢,因為缺乏索引。
ARCHIVE
- 壓縮存儲:ARCHIVE 引擎用于存儲大量歷史數據,可以壓縮數據以節省空間。數據只能追加,不能進行更新或刪除。
- 適用場景:適合用于存儲日志或歸檔數據,不適合頻繁更新的表。
NDB(Clustered)
- 高可用性和分布式存儲:NDB 是 MySQL 集群的存儲引擎,適用于分布式數據庫架構,支持多節點的高可用性和高擴展性。
- 數據存儲格式:NDB 數據存儲在集群的不同節點中,表和索引被分布在集群中。
4.2 表的存儲格式
MySQL 中的數據表存儲格式,取決于所使用的存儲引擎。常見的存儲格式有兩種:聚集索引存儲格式和非聚集索引存儲格式。
聚集索引存儲格式(InnoDB)
- 在 InnoDB 存儲引擎中,數據表默認使用聚集索引(Clustered Index)存儲。
- 聚集索引是將數據行按照主鍵值排序并存儲在數據文件中。每個數據表的實際數據行就是主鍵索引的葉子節點。
- 如果沒有主鍵,InnoDB 會選擇一個唯一索引作為聚集索引;如果表沒有唯一索引,InnoDB 會隱式創建一個 6 字節的主鍵作為聚集索引。
- 優勢:通過聚集索引存儲數據,查詢效率高,尤其是基于主鍵或索引的查詢。
- 劣勢:對于大量更新或刪除操作,聚集索引會導致數據的物理存儲塊的頻繁調整,可能會影響性能。
非聚集索引存儲格式(MyISAM)
- 在 MyISAM 存儲引擎中,數據表使用非聚集索引(Non-clustered Index)存儲。
- 數據表的記錄和索引是獨立存儲的。索引存儲在一個單獨的文件(.MYI),數據存儲在另一個文件(.MYD)中。
- 在查詢時,首先通過索引查找記錄的地址,然后再根據地址去讀取對應的記錄。
- 優勢:對只讀查詢性能較好,存儲和刪除操作簡單,索引文件和數據文件分開。
- 劣勢:查詢時需要多次磁盤訪問,效率相對較低。
4.3 MySQL 數據存儲的物理結構
MySQL 在磁盤上存儲數據時,使用不同的存儲引擎和存儲格式,每種存儲引擎有不同的文件存儲結構。
InnoDB 存儲格式
- 表空間:InnoDB 使用表空間來存儲數據和索引。表空間有兩種類型:
- 共享表空間:所有的 InnoDB 表都存儲在同一個表空間文件中(通常是 ibdata1)。這使得多個表的數據存儲在一個文件中,增加了管理的復雜性,但也提供了更高的空間利用率。
- 獨立表空間:每個表都使用一個獨立的文件存儲(.ibd 文件),適用于需要管理單獨表的情況。
- 數據頁:InnoDB 使用固定大小的數據頁(通常是 16KB)來存儲表的數據和索引。每個頁由多個行組成,每個頁通過 B+ 樹索引鏈接。
MyISAM 存儲格式
- 數據文件(.MYD 文件):存儲表的實際數據。
- 索引文件(.MYI 文件):存儲表的索引信息。
- 存儲結構:MyISAM 使用一個非聚集索引結構,每個數據表的記錄和索引是分開存儲的。每個 MyISAM 表的索引和數據都是獨立的文件。
MEMORY 存儲格式
- 內存存儲:MEMORY 引擎將所有的數據存儲在內存中。數據表在內存中存儲,表的數據會保存在操作系統的內存中,而不是寫入磁盤。
- 臨時數據:當 MySQL 重啟時,內存中的數據將丟失,適合用于存儲臨時的數據。
💕💕💕每一次的分享都是一次成長的旅程,感謝您的陪伴和關注。希望這些關于MySQL的文章能陪伴您走過技術的一段旅程,共同見證成長和進步!😺😺😺
🧨🧨🧨讓我們一起在技術的海洋中探索前行,共同書寫美好的未來!!!?