MySQL入門基礎指南

目錄

一、什么是數據庫?

僅依靠文件存儲數據存在以下幾個明顯缺點:

數據庫的存儲介質通常包括:

二、主流數據庫介紹

三、客戶端 VS 服務器

四、推薦看的MySQL安裝技術博客

五、數據庫的存儲介質

數據庫的存儲介質主要分為以下兩類:

具體說明如下:

六、連接 MySQL 服務器

1、參數說明

2、詳細解釋

1. 連接方式不同

2. 認證機制不同

3. 驗證這個理論

4. 解決方案

5. 為什么這樣設計?

3、退出 MySQL 客戶端

七、服務器管理

1、停止 MySQL 服務器

2、啟動 MySQL 服務器

3、重啟 MySQL 服務器

4、額外有用的命令

查看 MySQL 服務狀態(檢查是否正在運行、是否有錯誤信息)

設置 MySQL 開機自啟

禁用 MySQL 開機自啟

驗證 MySQL 是否成功啟動(通過連接到數據庫)

5、重要提示

6、擴展:Windows 服務器管理(了解即可)

打開服務管理器的方法

管理服務

補充說明

八、數據庫客戶端、數據庫服務器(服務端)、數據庫與表的關系

1、數據庫服務器 (Database Server)

2、數據庫 (Database)

3、表 (Table)

4、數據庫客戶端 (Database Client)

5、四者關系總結

6、補充說明

7、核心概念整理

1. 數據庫與數據庫服務

2. 文件與數據庫的對比

3. MySQL 的架構模式

4. 數據庫在系統中的實際表現

九、使用案例(先導了解使用,起到認識作用)

1、數據存儲路徑

2、創建數據庫

驗證數據庫確實已創建

3、數據庫刪除

4、使用數據庫

5、創建數據庫表

文件解釋

為什么會有這個文件?

與之前版本的區別

總結

6、表中插入數據

7、查詢表中的數據

十、數據的邏輯存儲結構

行(Row):

列(Column):

補充說明:

十一、MySQL 體系架構概述

1、連接層(Connection Layer)

2、服務層(Server Layer)

3、存儲引擎層(Storage Engine Layer)

4、存儲層(Storage Layer)

補充說明:

十二、MySQL 客戶端

1、$?作為變量引用符(在您問的命令中就是這個作用)

2、file $(which mysql)

3、ldd $(which mysql)

4、MySQL 客戶端 (Client)

特征說明:

5、MySQL 服務端在哪里?

服務端的特征:

十三、SQL 語言分類

1、DDL(數據定義語言 | Data Definition Language)

2、DML(數據操作語言 | Data Manipulation Language)

3、DCL(數據控制語言 | Data Control Language)

補充說明:

十四、存儲引擎(了解)

1、查看支持的存儲引擎

2、MySQL 存儲引擎特性對比表(中英版)

3、關鍵說明

4、選擇建議與注意事項


一、什么是數據庫?

????????雖然使用文件也可以存儲數據,但在實際開發中,數據庫提供了更為專業和高效的解決方案。數據庫是按照數據結構來組織、存儲和管理數據的倉庫,是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的集合。

僅依靠文件存儲數據存在以下幾個明顯缺點:

  • 安全性問題:文件系統難以實現對數據的精細權限控制和安全保護,容易遭受未授權訪問或數據泄露。

  • 查詢與管理效率低:文件存儲不支持高效的數據檢索和復雜查詢,缺乏統一的數據管理機制。

  • 海量數據存儲困難:文件格式不利于存儲和處理大規模數據,擴展性和性能受限。

  • 程序控制復雜:在應用程序中直接操作文件容易出錯,數據處理邏輯與業務邏輯混雜,維護成本高。

數據庫的存儲介質通常包括:

  • 磁盤(持久化存儲)

  • 內存(高速緩存,提升訪問性能)

????????為解決上述問題,數據庫應運而生。數據庫系統能夠更有效地組織、存儲、管理和保護數據,提供標準化的接口和查詢語言(如SQL),大幅提升了數據處理的效率和可靠性。因此,掌握數據庫技術已成為衡量程序員專業能力的重要指標之一。


二、主流數據庫介紹

目前市場上主流的數據庫系統包括以下幾種,各具特點,適用于不同場景:

  • SQL Server:微軟推出的關系型數據庫,深受 .NET 生態開發者的喜愛,適用于中大型企業級項目,具有良好的集成性和功能完備性。

  • Oracle:甲骨文公司旗下的關系型數據庫,擅長處理大型項目和復雜業務邏輯,在穩定性和功能豐富性方面表現卓越,但在高并發場景下通常不如 MySQL 輕量。

  • MySQL:全球最受歡迎的開源關系型數據庫,現為甲骨文公司所有。以其高并發性能和簡易部署著稱,廣泛應用于電商、社交網絡、論壇等互聯網場景。不過在對復雜業務和復雜查詢的支持上相對較弱。

  • PostgreSQL:起源于加州大學伯克利分校的關系型數據庫系統,開源且功能強大,支持私用、商用和學術用途。具有良好的擴展性和標準兼容性,適合復雜查詢和高可靠性要求的場景。

  • SQLite:一款輕量級、基于文件的關系型數據庫管理系統,遵循 ACID 事務原則。整個數據庫以一個庫文件形式存在,適用于嵌入式設備及輕量級應用,資源占用極低,內存需求可低至幾百KB。

  • H2:采用 Java 編寫的嵌入式數據庫,作為一個類庫可直接集成到應用程序中。特別適合在開發、測試和小型部署環境中作為內存數據庫使用,具有啟動快、配置簡便的特點。


三、客戶端 VS 服務器

????????在數據庫系統中,通常分為數據庫服務器數據庫客戶端兩個部分。以 MySQL 為例,當我們使用?mysql?命令連接數據庫時,實際上是在啟動一個客戶端,與運行在服務器上的 MySQL 服務(服務端)進行通信。例如:

此時所使用的?mysql?命令即為 MySQL 客戶端工具。服務器端的 MySQL 服務進程可以通過?ps?命令查看,例如:

ps -axj|head -1&&ps -axj|grep mysqld|grep -v grep

該命令提供了更詳細的進程信息,適合調試或確認運行環境:

  • ps -axj

    • -a:顯示所有用戶的進程。

    • -x:包括沒有控制終端的進程(如守護進程)。

    • -j:以作業格式顯示(包括 PPID、PGID、SID 等信息)。

  • head -1:顯示?ps -axj?輸出的第一行(即列標題)。

  • &&:如果第一條命令成功(總是成功),則執行后續命令。

  • grep mysqld:過濾出包含 "mysqld" 的行(即 MySQL 進程)。

  • grep -v grep:排除掉?grep mysqld?命令本身的進程(因為?grep?也會包含 "mysqld")。

輸出說明:輸出顯示了 MySQL 進程的詳細信息:

  • PPID:父進程 ID(這里是 1,說明由?systemd?或?init?直接啟動)。

  • PID:進程 ID(2739800)。

  • PGID:進程組 ID(2739800)。

  • SID:會話 ID(2739800)。

  • TTY:?(沒有控制終端,因為是守護進程)。

  • STAT:Ssl(睡眠狀態,多線程,是守護進程)。

  • UID:115(運行該進程的用戶 ID,通常是?mysql?用戶)。

  • TIME:CPU 時間(2:12)。

  • COMMAND:啟動命令(/usr/sbin/mysqld)。

更簡潔的替代命令:如果只想快速查看 MySQL 是否在運行,也可以使用:

systemctl status mysql

或者:

pgrep mysqld

????????其中?mysqld?即為 MySQL 服務器的服務進程。我們通過?mysql?客戶端命令實際連接的就是這一服務。進一步地,使用?netstat?命令可以查看網絡連接情況,可以看到 MySQL 服務器默認使用 TCP/IP 協議(可能包括 IPv6 版本的 TCP6),并處于監聽狀態,等待客戶端的連接。例如:

????????這說明 MySQL 服務器本質上是一個網絡服務器當我們使用?mysql?客戶端連接時,實際是向 MySQL 服務器發起 TCP 連接請求。連接建立之后,客戶端將用戶輸入的 SQL 語句發送至服務器,服務器接收并解析 SQL,執行相應的數據操作(如查詢、更新、刪除等),最后將結果返回給客戶端。


四、推薦看的MySQL安裝技術博客

CentOS 6.5下編譯安裝MySQL 5.6.14_野馬紅塵的技術博客_51CTO博客

(12 封私信) CentOS 7 通過 yum 安裝 MariaDB - 知乎

Windows下通過MySQL Installer安裝MySQL服務_野馬紅塵的技術博客_51CTO博客


五、數據庫的存儲介質

數據庫的存儲介質主要分為以下兩類:

  • 磁盤:例如 MySQL 就是一種典型的磁盤數據庫。

  • 內存:例如 Redis 就是一種常見的內存數據庫。

具體說明如下:

數據庫根據存儲介質的不同,可分為磁盤數據庫內存數據庫。內存數據庫也稱為主存數據庫(Main Memory Database)。

????????磁盤數據庫將數據主要存儲在磁盤中,因此在數據持久化方面具有顯著優勢。為了提升數據存取效率,這類數據庫通常也設計有緩存機制。因此,并非所有數據在任何時刻都會立即被刷新到磁盤,部分數據可能暫時駐留在內存中。

????????內存數據庫則主要將數據存儲在內存中,相比磁盤數據庫,其數據讀取速度更快,能夠大幅降低訪問延遲。不過,內存數據庫并非完全不用磁盤,例如啟動信息、初始化數據等內容仍會存儲在磁盤上,只是核心的數據操作和計算主要在內存中進行。

????????由于內存數據庫的數據存儲在易失性內存中,一旦數據庫主機斷電,數據就可能丟失。因此,在服務關閉前,通常需要將內存中的數據轉儲到磁盤中。甚至很多內存數據庫在運行期間也會定期將數據持久化到磁盤,以保障數據的可靠性和可恢復性。


六、連接 MySQL 服務器

我們可以通過以下命令連接 MySQL 服務器:

mysql -h 127.0.0.1 -P 3306 -u root -p

1、參數說明

  • -h:指定要連接的 MySQL 服務器主機地址。127.0.0.1?表示本地主機。

  • -P:指定 MySQL 服務監聽的端口號,默認為?3306

  • -u:指定用于連接的用戶名,root?為具有最高權限的超級用戶。

  • -p:表示需要輸入用戶密碼。密碼可直接寫在?-p?后面(如?-p123456),也可在回車后單獨輸入(推薦后者,更安全)。

但是因為我使用的是Ubuntu系統,所以會出現下面的這種情況,下面會講解解決方法:

????????如果連接的是本地 MySQL 服務器(即運行在本機的服務端,下面會講解數據庫服務端和客戶端等關系),可省略主機和端口參數,直接使用以下方式連接:

mysql -u root -p

有密碼就輸入登錄密碼,沒有密碼或者免密碼就直接按回車(Enter)登錄:

? ? ? ? 我們能使用?mysql -u root -p?成功登錄是因為這個命令實際上是通過?Unix socket 連接?而不是 TCP 連接,并且 MySQL 配置了?auth_socket?插件進行認證。

2、詳細解釋

1. 連接方式不同

  • mysql -u root -p?→ 默認使用 Unix socket 連接

  • mysql -h 127.0.0.1 -P 3306 -u root -p?→ 使用 TCP/IP 連接

2. 認證機制不同

使用 socket 連接時:

  • MySQL 的?auth_socket?插件會檢查:

    • 你正在使用的系統用戶名

    • 你請求登錄的 MySQL 用戶名

  • 如果系統用戶有權限(比如是 root 或有 sudo 權限),且 MySQL 用戶存在,就允許登錄

  • 不需要密碼,因為系統身份已經驗證了

使用 TCP/IP 連接時:

  • MySQL 要求密碼認證

  • 即使輸入正確密碼,如果 root 用戶配置為?auth_socket?插件,也會拒絕TCP連接

3. 驗證這個理論

登錄MySQL后,在MySQL中,我們可以檢查 root 用戶的認證插件:

SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

很可能你會看到:

4. 解決方案

如果你想通過 TCP/IP 連接(如?127.0.0.1),需要修改認證方式:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密碼';
FLUSH PRIVILEGES;

5. 為什么這樣設計?

這是 Ubuntu MySQL 包的安全特性:

  • 防止遠程連接使用 root

  • 要求系統級權限才能管理 MySQL

  • 增加安全性,避免密碼泄露風險

所以你能用?mysql -u root -p?登錄是正常行為,這是 Ubuntu 上 MySQL 的默認安全配置。

3、退出 MySQL 客戶端

成功連接后,可以輸入 SQL 語句交由服務器執行。若要退出 MySQL 客戶端,可輸入以下任一命令:

quit
exit
\q

退出后將返回到系統命令行界面,如下:


七、服務器管理

1、停止 MySQL 服務器

# 使用 systemctl (推薦)
sudo systemctl stop mysql

# 或者使用 service 命令
sudo service mysql stop

2、啟動 MySQL 服務器

# 使用 systemctl (推薦)
sudo systemctl start mysql

# 或者使用 service 命令
sudo service mysql start

3、重啟 MySQL 服務器

# 使用 systemctl (推薦)
sudo systemctl restart mysql# 或者使用 service 命令
sudo service mysql restart

觀察MySQL服務器進程的PID,已經發生了變化,說明已經重啟了:

4、額外有用的命令

查看 MySQL 服務狀態(檢查是否正在運行、是否有錯誤信息)

sudo systemctl status mysql

設置 MySQL 開機自啟

sudo systemctl enable mysql

禁用 MySQL 開機自啟

sudo systemctl disable mysql

驗證 MySQL 是否成功啟動(通過連接到數據庫)

sudo mysql -u root -p

5、重要提示

1. sudo: 管理服務需要 root 權限,所以必須在命令前加上?sudo

2. 服務名確認: 在極少數情況下,如果是從非官方源安裝或其他特殊配置,服務名可能不同。可以使用以下命令列出所有服務來確認:

sudo systemctl list-units --type=service | grep -i mysql

或者

sudo service --status-all | grep -i mysql

這會顯示出完整的服務名,確保您使用的是正確的名稱。對于從 Ubuntu 官方倉庫安裝的標準 MySQL,名稱就是?mysql

6、擴展:Windows 服務器管理(了解即可)

在 Windows 操作系統中,可以通過圖形化的服務管理器來輕松管理系統上運行的各種服務(如 MySQL、Apache 等)。

打開服務管理器的方法

最快捷的常用方法是:

  1. 按下鍵盤組合鍵?Win + R,打開“運行”對話框。

  2. 在輸入框中鍵入?services.msc

  3. 按下回車鍵?Enter?或點擊“確定”。

管理服務

在打開的服務管理器窗口中:

  1. 從列表中找到需要管理的服務(例如?MySQL80?或?MySQL,名稱取決于安裝版本)。

  2. 選中該服務后,可以通過窗口左側的按鈕進行管理:

    • 啟動: 運行所選服務。

    • 停止: 終止正在運行的服務。

    • 暫停: 暫時掛起服務(并非所有服務都支持此操作)。

    • 重新啟動: 先停止然后再啟動該服務。

也可以右鍵點擊服務名稱,在彈出的菜單中選擇相應操作。

補充說明

  • 服務名稱確認: Windows 上的 MySQL 服務名稱可能不是簡單的 "mysql",通常帶有版本號,如?MySQL80,?MySQL57?或?MySQLRouter?等。請根據您的安裝準確找到對應的服務。

  • 設置啟動類型(非常重要):右鍵點擊服務并選擇“屬性”,可以配置其“啟動類型”:

    • 自動: 系統啟動時自動運行該服務。

    • 自動(延遲啟動): 系統啟動后稍等片刻再啟動,有助于優化開機速度。

    • 手動: 需要用戶手動啟動,不會隨系統自動運行。

    • 禁用: 禁止該服務被啟動。

  • 使用命令行管理 (以管理員身份運行 CMD 或 PowerShell):雖然圖形界面方便,但命令行在腳本編寫或遠程管理時更為強大。

    • 啟動服務:?net start <服務名>?或?sc start <服務名>

      • 示例:?net start MySQL80

    • 停止服務:?net stop <服務名>?或?sc stop <服務名>

      • 示例:?net stop MySQL80

    • 查看服務狀態:?sc query <服務名>

  • 權限要求: 無論是通過圖形界面還是命令行管理服務,都需要管理員權限。如果當前用戶不是管理員,操作時會提示您輸入管理員憑據。


八、數據庫客戶端、數據庫服務器(服務端)、數據庫與表的關系

????????在一個完整的數據庫應用體系中,數據庫客戶端、數據庫服務器、數據庫和表構成了一個清晰的層次關系,共同協作以實現數據的存儲、管理和訪問。

1、數據庫服務器 (Database Server)

  • 它是核心,指安裝并運行在物理機器上的數據庫管理系統(DBMS)?軟件(如 MySQL Server、PostgreSQL)。

  • 負責管理所有的數據庫,處理連接請求、執行SQL操作、維護數據完整性與安全,并控制并發訪問。

  • 作為一個常駐運行的網絡服務,監聽特定端口(如MySQL的3306),等待客戶端連接。

2、數據庫 (Database)

  • 由數據庫服務器創建和管理,是用于組織數據的邏輯容器

  • 通常,一個應用對應一個數據庫,實現了數據的隔離。

  • 一個數據庫服務器可以托管多個數據庫

3、表 (Table)

  • 存在于數據庫內部,是存儲實際數據的基本結構

  • 每張表對應一個實體(如用戶、訂單),通過行和列來組織數據。

  • 一個數據庫中包含多張表,這些表之間可以通過關系(如外鍵)相互關聯。

4、數據庫客戶端 (Database Client)

  • 是與用戶或應用程序交互的工具或程序,用于連接并操作數據庫服務器(如?mysql?命令行工具、Navicat、PHP/Python應用程序)。

  • 客戶端通過網絡協議(如TCP/IP)向服務器發送SQL命令(如?SELECT,?INSERT)。

  • 服務器執行命令后,將結果返回給客戶端。

5、四者關系總結

組件角色與功能關系比喻
數據庫服務器管理者:提供核心數據服務,管理多個數據庫。銀行總部
數據庫保險庫:歸類存放數據,每個應用一個“庫”,實現數據隔離。銀行中的不同金庫(個人/對公)》
貨架/抽屜:在每個金庫中,用于結構化存儲特定類型的數據(實體)。金庫中存放特定物品的貨架
數據庫客戶端柜員或ATM機:用戶通過它與總部交互,提交操作請求(存/取款)并獲取結果。你與銀行交互的窗口

關系流程用戶/程序?→ 通過數據庫客戶端?→ 連接到數據庫服務器?→ 選擇操作的數據庫?→ 對其中的進行增刪改查。

6、補充說明

  • 通信方式:客戶端與服務器之間通常通過網絡(如TCP/IP)進行通信,遵循特定的數據庫協議(如MySQL協議)。

  • 一個典型操作流程

    • 客戶端(如mysql -u root -p)發起連接到服務器(127.0.0.1:3306)。

    • 認證成功后,客戶端選擇數據庫(USE mydatabase;)。

    • 客戶端發送SQL操作指定表中的數據(SELECT * FROM users;)。

    • 服務器執行后,將users表的結果集返回給客戶端顯示。

????????這個結構確保了數據管理的秩序、安全性和效率。這種層次結構可表示為:數據庫客戶端 → 數據庫服務器 → 多個數據庫 → 每個數據庫包含多張表

上圖清晰地展示了數據庫體系中的層次關系:

  • Client(客戶端): 對應 MySQL 客戶端工具(如?mysql?命令),用于連接服務器并執行操作。

  • MySQL(服務器): 對應?mysqld?服務進程,是數據庫系統的核心,負責管理數據、處理請求并返回結果。

  • DB(數據庫): 代表由?mysqld?管理的多個邏輯數據庫。通常每個應用對應一個數據庫,實現數據隔離。

  • : 存在于每個數據庫中,是實際存儲數據的結構化實體,每張表對應一種業務數據(如用戶表、訂單表)。

關系總結:用戶通過Client連接到MySQL服務器,訪問指定的DB,并對其中的進行增刪改查等操作。這種分層結構實現了數據的有序管理和高效訪問。

7、核心概念整理

1. 數據庫與數據庫服務

  • 數據庫:指在磁盤或內存中,按照特定結構組織的數據集合。它是在磁盤上存儲數據的一套完整方案。

  • 數據庫服務:指?mysqld?進程,它是 MySQL 服務的服務器端,負責管理數據庫的存儲、訪問和操作。

2. 文件與數據庫的對比

  • 普通文件雖然能存儲數據,但缺乏有效的數據管理能力(從用戶角度)。

  • 數據庫提供了一套完整的數據存儲與管理解決方案,用戶只需提出需求(如查詢條件),數據庫直接返回結果。

3. MySQL 的架構模式

  • MySQL(mysql):是數據庫服務的客戶端

  • mysqld:是數據庫服務的服務器端

  • MySQL 本質是一種基于 C/S(客戶端/服務器)架構的網絡服務

4. 數據庫在系統中的實際表現

通過一個示例說明 MySQL 在 Linux 系統中的實際體現:

  • 創建數據庫:本質是在 Linux 下創建一個目錄

  • 創建表:本質是在該數據庫目錄下創建對應的文件

  • 數據庫的本質:也是文件,但這些文件不由程序員直接操作,而是由?mysqld?服務代為管理。


九、使用案例(先導了解使用,起到認識作用)

1、數據存儲路徑

????????通過MySQL創建的數據庫和各種表結構,最終會以文件的形式存儲下來,通過查看MySQL的配置文件中的datadir可以得知數據文件的存儲路徑。比如我的Ubuntu 20.04機器的MySQL配置文件的絕對路徑為/etc/mysql/mysql.conf.d/mysqld.cnf,配置文件中datadir對應的值為/var/lib/mysql。如下:

將來MySQL創建的數據庫文件都會存儲在該目錄下,可以看到該目錄下有很多MySQL相關的數據文件。如下:

2、創建數據庫

連接MySQL服務器后,通過create語句創建一個名為helloworld的數據庫。比如:

create database helloworld;

這時/var/lib/mysql目錄下,就會多出一個名為helloworld的目錄。如下:

????????在以前的版本中,helloworld目錄下可能出現只有一個名為的db.opt的文件,該文件中指明了當前數據庫的默認字符編碼和字符校驗規則(關于是什么的概念,后面的博客中會正式引入)。但是(現在先了解即可):

  • db.opt?文件是在 MySQL?初始化一個新數據庫時創建的。在 MySQL 5.7 及更早版本中,這個文件確實會立即出現。

  • 然而,從 MySQL 8.0 開始,行為發生了變化。?為了提升性能和整合數據字典,MySQL 8.0 將數據庫的元數據(包括默認字符集和排序規則)統一存儲在了新的、共用的數據字典表(InnoDB 表)中,這些表位于 MySQL 的系統表空間(通常是?ibdata1?文件)里。

  • 在 MySQL 8.0+ 中,db.opt?文件不再是必須的。它可能會在特定操作后生成,也可能永遠不會生成。它的存在更多是為了向后兼容或便于某些備份工具工作。

驗證數據庫確實已創建

雖然目錄是空的,但您的數據庫已經成功創建了。您可以在 MySQL 客戶端中通過以下命令驗證:

SHOW DATABASES LIKE 'helloworld';

或者查看它的默認字符集設置:

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'helloworld';

這條命令會從內置的?information_schema?數據庫中查詢信息,這正是 MySQL 8.0 存儲元數據的地方。

項目情況解釋
MySQL 版本8.0.42這是關鍵信息。MySQL 8.0 改變了元數據存儲方式。
操作CREATE DATABASE helloworld;僅創建了空數據庫,未創建任何表。
現象helloworld?目錄為空完全正常。在 MySQL 8.0+ 中,空數據庫的目錄就是空的。
元數據存儲位置information_schema?系統數據庫字符集、排序規則等設置現在存儲于此,而不是?db.opt?文件。

3、數據庫刪除

? ? ? ? 所以我們創建數據庫的本質就是在MySQL的數據存儲路徑下新建了一個目錄,而當我們將這個數據庫刪除后,可以看到下圖此時在MySQL的數據存儲路徑下的helloworld目錄也就不存在了,因此刪除數據庫本質就是刪除數據存儲路徑下對應的目錄。比如:

drop database helloworld;

4、使用數據庫

使用數據庫之前,可以先通過show語句查看當前都有哪些數據庫,然后再通過use語句使用指定的數據庫。比如:

show databases;

use helloworld;

使用數據庫可以理解成,就是使用cd命令進入到該數據庫對應的目錄當中。

5、創建數據庫表

這里我們通過create語句創建一個簡單的student表。比如:

create table student(
id int,
name varchar(32),
gender varchar(2)
);

通過show語句可以查看創建的student表結構。比如:

這兩種查看方式的主要區別在于輸出格式

show create table student;
  • 表格格式:以行列表格形式顯示結果

  • 可讀性:在終端中顯示可能會換行,比較混亂

  • 適合:快速查看,但格式可能不整齊

show create table student \G
  • 垂直格式:使用?\G?代替分號,以鍵值對形式垂直顯示結果

  • 可讀性更清晰易讀,每個字段單獨一行顯示

  • 適合:查看包含長文本(如建表語句)的詳細結果

簡單說:\G?讓輸出格式更整潔,更容易閱讀長的SQL語句。?在處理包含復雜結構的數據時,\G?是更好的選擇。

結合上面創建的?student?表,現在?helloworld?目錄中出現的?student.ibd?文件是?MySQL 8.0 中 InnoDB 存儲引擎的表空間文件

文件解釋

student.ibd:這是?student?表的獨立表空間文件。

為什么會有這個文件?

在 MySQL 8.0 中,默認使用?InnoDB?存儲引擎,并且默認配置為:

  1. 每表一個表空間:每個 InnoDB 表都有自己的?.ibd?文件

  2. 存儲內容:這個文件中包含了:表的數據(插入的記錄)、表的索引、該表相關的元數據信息

與之前版本的區別

  • MySQL 5.7 及以前:可能會看到?.frm?文件(表結構定義)和?.ibd?文件

  • MySQL 8.0+只有?.ibd?文件,因為表結構信息現在存儲在系統數據字典中(在?ibdata1?文件里),不再需要單獨的?.frm?文件

總結

文件說明
student.ibdstudent?表的獨立表空間文件,包含表的數據和索引
沒有?db.opt數據庫配置信息存儲在系統數據字典中
沒有?.frm表結構信息也存儲在系統數據字典中

這說明?student?表已經成功創建,并且 MySQL 正在使用現代的 InnoDB 表管理方式。當向表中插入數據時,數據就會存儲在這個?student.ibd?文件中。

6、表中插入數據

通過desc語句可以查看對應的表結構,而不是內容,是相關屬性的意思。比如:

desc student;

通過insert語句可以向表中插入數據。比如:

7、查詢表中的數據

通過select語句可以查看表中的數據。比如:

select * from student;


十、數據的邏輯存儲結構

????????在 MySQL 中,表中數據的組織形式可以直觀地理解為一個二維表格,它由行(Row)和列(Column)共同構成,是關系型數據庫中最基本的數據存儲邏輯。其結構如下所示:

行(Row)

????????表中的每一行代表一條完整的記錄(Record),也就是一個實體的具體信息。例如,在?student?表中,每一行就對應一名學生的全部數據。

列(Column)

????????每一列代表一個屬性或字段(Attribute/Field),用于描述記錄的某一方面特征。例如,student?表中的?name?列存儲學生姓名,age?列存儲學生年齡。

補充說明:

  • 這種行列結構使得數據的存儲非常有條理,既便于理解,也方便通過 SQL 進行查詢、更新和管理。

  • 每張表通常還會有一個主鍵(Primary Key),用于唯一標識每一行記錄,確保數據的唯一性和完整性。

  • 不同的列可以定義不同的數據類型(如 INT, VARCHAR, DATE 等),以適應不同種類的數據存儲需求。


十一、MySQL 體系架構概述

????????MySQL 是一款高度可移植的關系型數據庫管理系統,支持主流操作系統包括 Linux、Windows、macOS 和 Solaris 等。雖然不同平臺在底層實現上存在差異,但 MySQL 保持了跨平臺的物理和邏輯體系結構的一致性,為用戶提供了統一的操作和開發體驗。

如上圖所示,其整體架構可劃分為以下四個核心層次:

1、連接層(Connection Layer)

  • 負責客戶端連接的建立、用戶身份認證、安全方案實施(如 SSL 加密)以及連接池管理。

  • 處理并發連接請求,驗證用戶權限,確保通信安全。

2、服務層(Server Layer)

是 MySQL 的“大腦”,完成核心邏輯處理:

  • SQL 接口:接收并處理 SQL 命令。

  • 解析器:進行詞法、語法分析,生成解析樹。

  • 優化器:制定最優查詢執行計劃,選擇索引與連接策略。

  • 緩存管理:查詢緩存(注:MySQL 8.0 已移除查詢緩存)。

  • 內置函數:執行日期、數學、字符串等內置操作。

  • 支持存儲過程、觸發器、視圖等高級功能。

3、存儲引擎層(Storage Engine Layer)

  • 采用可插拔式架構,支持多種存儲引擎(如 InnoDB、MyISAM、Memory 等)。

  • 負責數據的實際存儲與讀取

  • 服務層通過統一的存儲引擎 API 與不同引擎交互,引擎根據其特性實現事務、鎖、索引等機制。

4、存儲層(Storage Layer)

  • 是數據的最終物理存儲位置,通過文件系統(如 ext4、NTFS)或裸設備管理磁盤數據。

  • 存儲引擎在該層讀寫數據文件(如 .ibd、.frm、.myd 等)。

補充說明:

  • 這種分層且模塊化的設計,使得 MySQL 在保持高性能的同時,具備了良好的靈活性和可擴展性。

  • 用戶可以根據業務需求選擇合適的存儲引擎,例如 InnoDB 適用于需要事務的場景,而 MyISAM 適用于讀多寫少的場景。


十二、MySQL 客戶端

MySQL 客戶端泛指所有能夠向 MySQL 服務器發送 SQL 語句的工具或程序,主要包括:

  • 命令行工具:如?mysql?命令,是常用的交互式客戶端(也就是我們現在使用的這種)

  • 語言接口客戶端:MySQL 為多種編程語言(如 C/C++、Python、Java、PHP、Go 等)提供了官方的或第三方的數據庫驅動和連接庫,允許開發者通過代碼調用接口執行 SQL。

例如,標準的?mysql?命令行工具本身是一個由 C/C++ 編寫的可執行程序。可通過以下命令查看其信息:

file $(which mysql)
ldd $(which mysql)

1、$?作為變量引用符(在您問的命令中就是這個作用)

$(command)?是命令替換的語法:

  • 先執行?which mysql?這個命令

  • 然后用該命令的輸出結果(即mysql的路徑)替換整個?$(which mysql)?部分

2、file $(which mysql)

作用:查看 mysql 客戶端程序的文件類型信息

  • which mysql:找到?mysql?命令的完整路徑(如?/usr/bin/mysql

  • file:分析該文件的類型

  • 輸出示例:會顯示這是一個 ELF 可執行文件、動態鏈接庫信息、以及適用的架構(如 x86-64)

簡單說:告訴你 mysql 程序是什么類型的文件。

3、ldd $(which mysql)

作用:查看 mysql 客戶端程序依賴哪些共享庫(動態鏈接庫)

  • ldd:列出二進制文件所依賴的所有共享庫

  • 輸出示例:會顯示一長串?.so?文件(如?libmysqlclient.so,?libc.so.6?等)及其內存地址

簡單說:告訴你 mysql 程序運行需要哪些額外的庫文件。

命令用途輸出內容
file $(which mysql)查看文件屬性文件類型、格式、架構
ldd $(which mysql)查看依賴關系所需共享庫列表及路徑

回顧一下:這兩個命令常用于故障排查,比如程序無法運行時檢查是否缺少依賴庫,或者確認程序的版本和架構。

????????輸出結果將顯示其依賴的動態鏈接庫,說明它是基于 MySQL 提供的 C API 開發的。因此,無論是命令行工具還是應用程序,本質都是通過調用 MySQL 提供的各語言接口客戶端與服務器進行交互。

4、MySQL 客戶端 (Client)

root@hcss-ecs-1c15:~# mysql?這個界面是?MySQL 客戶端

特征說明:

  • 圖片中是在操作系統命令行中執行了?mysql?命令

  • 出現了?Welcome to the MySQL monitor...?歡迎信息

  • 顯示?Your MySQL connection id is 10(連接ID為10)

  • 顯示?Server version: 8.0.42...(服務器版本信息)

  • 出現?mysql>?提示符,等待輸入SQL命令

這是一個客戶端工具,用于連接和操作MySQL服務器。

5、MySQL 服務端在哪里?

MySQL 服務端(Server)在后臺運行,并沒有在前臺直接顯示出來。

服務端的特征:

  • 是一個常駐內存的守護進程(通常是?mysqld

  • 在后臺持續運行,監聽網絡端口(默認3306)

  • 接收客戶端的連接請求

  • 處理SQL查詢并返回結果

  • 管理數據庫文件的讀寫


十三、SQL 語言分類

????????SQL(Structured Query Language,結構化查詢語言)是一種專用于關系型數據庫(重點!!!)的標準化語言(一般使用小寫,大寫也是可以的,不過大寫的不宜看并且還要切換大小寫,比較麻煩,還是推薦使用小寫,通俗易懂),用于執行數據查詢、數據操作、數據庫結構管理及權限控制等任務。

根據其功能的不同,SQL 語句通常可分為以下三類:

1、DDL(數據定義語言 | Data Definition Language)

  • 用于定義和管理數據庫對象(如表、索引、視圖等)的結構。

  • 常用語句包括:

    • CREATE:創建數據庫或表

    • ALTER:修改現有數據庫對象

    • DROP:刪除數據庫或表

    • TRUNCATE:清空表內容(保留結構)

2、DML(數據操作語言 | Data Manipulation Language)

  • 用于對數據庫中的數據進行增、刪、改等操作。

  • 常用語句包括:

    • INSERT:插入新數據

    • UPDATE:更新已有數據

    • DELETE:刪除數據

在實際應用中,常將查詢類語句單獨歸類為?DQL(數據查詢語言 | Data Query Language),主要包括:

  • SELECT:查詢數據

  • FROMWHERE?等子句用于構建查詢條件

3、DCL(數據控制語言 | Data Control Language)

  • 用于控制數據庫訪問權限和事務管理。

  • 常用語句包括:

    • GRANT:授予用戶權限

    • REVOKE:撤銷用戶權限

    • COMMIT:提交事務

    • ROLLBACK:回滾事務

補充說明:

  • 有些分類方式還會包括?TCL(事務控制語言 | Transaction Control Language),用于管理事務,如?COMMIT?和?ROLLBACK

  • 不同數據庫系統(如 MySQL、PostgreSQL、Oracle)對 SQL 語法的支持略有差異,但核心分類保持一致。

  • SQL 是一種聲明式語言,用戶只需指定“做什么”,而不需關心“如何做”,具體執行由數據庫引擎優化完成。


十四、存儲引擎(了解)

????????存儲引擎是數據庫管理系統的核心組件,負責管理數據的存儲方式、索引建立、數據更新和查詢等底層功能的實現。MySQL 采用插件式存儲引擎架構,允許用戶根據實際需求選擇合適的存儲引擎,甚至在同一數據庫中為不同表配置不同的存儲引擎。

1、查看支持的存儲引擎

通過以下 SQL 命令可以查看當前 MySQL 服務器支持的所有存儲引擎:

SHOW ENGINES;

????????觀察列出的存儲引擎表可以看出,MySQL 默認使用的存儲引擎是?InnoDB,它支持事務、行級鎖、外鍵約束等關鍵特性,適用于大多數需要高可靠性和并發性能的應用場景。

2、MySQL 存儲引擎特性對比表(中英版)

特性MyISAMBDBMemoryInnoDBArchiveNDB
存儲限制64TB
事務支持??????
鎖定粒度表鎖頁鎖表鎖行鎖行鎖行鎖
MVCC/快照讀??????
地理空間支持??????
B樹索引??????
哈希索引??????
全文索引???? (8.0+)??
聚簇索引??????
數據緩存??N/A???
索引緩存??N/A???
數據壓縮??????
數據加密??????
存儲成本N/A非常低
內存成本中等
批量插入速度非常高
集群支持??????
復制支持??????
外鍵支持??????
備份/時間點恢復??????
查詢緩存支持??????
更新數據字典統計信息??????

? = 支持,? = 不支持,空白 = 視版本或配置而定

3、關鍵說明

  • MVCC:多版本并發控制,是 InnoDB 實現高并發的重要機制。

  • 存儲成本:指數據在磁盤上占用的空間大小。

  • 內存成本:指引擎運行時所消耗的內存大小。

  • BDB(Berkeley DB)引擎現已較少使用,官方不再積極維護。

  • Archive?引擎非常適合存儲大量歷史歸檔數據。

  • NDB?是用于 MySQL Cluster 的集群存儲引擎。

4、選擇建議與注意事項

  • InnoDB:適用于絕大多數需要事務安全(如金融系統)、并發控制(行級鎖)和外鍵約束的應用。是 MySQL 的默認引擎,也是推薦的首選。

  • MyISAM:適用于讀多寫少、不需要事務的場景(如日志系統、數據倉庫查詢)。不支持事務和行級鎖

  • Memory:所有數據存儲在內存中,速度極快,但重啟后數據丟失。適用于臨時表或緩存。

  • Archive:專為高速插入和壓縮存儲設計,適用于歷史數據歸檔,不支持索引更新。

  • NDB:適用于分布式集群環境,提供高可用性和實時性。

重要提示:在實際選擇存儲引擎時,請務必結合業務的讀寫比例、事務要求、一致性需求和性能目標進行綜合考量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96604.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【實戰中提升自己完結篇】分支篇之分支之無線、內網安全與QOS部署(完結)

1 1拓撲 「模擬器、工具合集」復制整段內容 鏈接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil1 分支無線部署 說明&#xff1a;分支無線用瘦AP部署&#xff0c;通過VPN直接注冊到總部的AC上面&#xff0c;實現無線的業務提供&…

帶你了解STM32:GPIO通用輸入輸出口

目錄 3.1 GPIO簡介 3.2 GPIO基本結構 3.3 GPIO位結構 輸入部分&#xff1a; 二極管的保護作用&#xff1a; 施密特觸發器&#xff1a; 片上外設端口 輸出部分&#xff1a; MOS管 3.4 GPIO模式 3.4.1 浮空/上拉/下拉輸入 3.4.2 模擬輸入 3.4.3 開漏/推挽輸出 3.4.…

Http(自寫)

作為一個程序員&#xff0c;假設我們要在a電腦的進程里發一段數據到b電腦&#xff0c;一般使用socket編程&#xff0c;可選項也就tcp&#xff0c;udp二選一socket本質上就是一個代碼庫tcp有粘包問題&#xff08;字節流&#xff09;&#xff0c;純裸tcp不能之際拿來使用所以我們…

C#使用OpenVinoSharp和PP-Human進行行人檢測

效果 項目依賴 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代碼 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向對象:類、對象與伴生關系

在前幾節中&#xff0c;我們學習了 Scala 的基礎語法和流程控制。現在&#xff0c;我們將深入探索 Scala 作為一門純粹的面向對象語言的核心。在 Scala 中&#xff0c;萬物皆對象&#xff0c;沒有像 Java 那樣的原始類型和靜態成員的區分。本節將重點介紹如何定義對象的藍圖&am…

【大語言模型 58】分布式文件系統:訓練數據高效存儲

分布式文件系統&#xff1a;訓練數據高效存儲 關鍵詞&#xff1a;分布式文件系統、HDFS、Lustre、GlusterFS、數據本地性、I/O優化、存儲架構、大數據存儲、訓練數據管理、存儲性能調優 摘要&#xff1a;本文深入探討大語言模型訓練中的分布式文件系統技術&#xff0c;從存儲架…

【科研繪圖系列】R語言繪制散點圖以及線性回歸擬合曲線圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 數據下載 函數 導入數據 數據預處理 畫圖 總結 系統信息 介紹 數據導入 代碼的開始部分涉及多個數據集的導入,這些數據集涵蓋了不同類型的生態學數據,包括實驗室培養…

SQL 數據庫操作語言詳解

1. SQL 語言概述SQL&#xff08;Structured Query Language&#xff09;是用于管理關系型數據庫的標準語言&#xff0c;主要分為以下幾個子語言&#xff1a;- DQL&#xff08;數據查詢語言&#xff09;&#xff1a;SELECT - 用于數據查詢 - DML&#xff08;數據操作語言&#x…

積分變換的前世今生

積分變換常應用于解微分方程微分方程的解法&#xff1a;時域經典法&#xff1b;頻域變換法&#xff1b;“積分變換”最初并不是為了解微分方程&#xff0c;而是出于更“純粹”的數學動機——理解函數的結構、求解代數或幾何問題&#xff0c;以及簡化復雜的積分運算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一個由 Google 開發的命令行參數解析庫&#xff0c;主要用于在 C&#xff08;也支持其他語言&#xff09;程序中便捷地處理命令行參數。它的核心作用是幫助開發者快速定義、解析和使用命令行選項&#xff0c;避免手動編寫繁瑣的參數解析…

編譯器的前端中端和后端

前面說的詞法分析和語法分析&#xff0c;確實是編譯器前端 (Front End) 最核心的兩個部分。但前端的工作還沒有結束。編譯器各階段劃分 一個完整的編譯器通常可以分為三個部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心職責: 理解源代碼。…

黑馬Java進階教程,全面剖析Java多線程編程,并發和并行,筆記02

黑馬Java進階教程&#xff0c;全面剖析Java多線程編程&#xff0c;并發和并行&#xff0c;筆記02 一、并發和并行 并發&#xff1a;在同一時刻&#xff0c;有多個指令在單個CPU上交替執行 并行&#xff1a;在同一時刻&#xff0c;有多個指令在多個CPU上同時執行 二、為什么有…

20250908 背包DP總結

引子 ~ 我們都有一個家&#xff0c;名字叫背包 ~ 背包DP 顧名思義&#xff0c;背包DP是用來解決背包最值問題的。題目會給出背包的容量&#xff0c;以及幾個物品的屬性&#xff0c;比如重量&#xff0c;價值&#xff0c;限額等等&#xff0c;具體是什么看題目。 01背包 01…

Redis持久化之RDB:快照機制原理、配置與最佳實踐

Redis持久化之RDB&#xff1a;快照機制原理、配置與最佳實踐 1. RDB持久化概述 1.1 什么是RDB RDB&#xff08;Redis Database&#xff09;是Redis的默認持久化方式&#xff0c;它在指定的時間間隔內生成數據集的快照&#xff08;snapshot&#xff09;&#xff0c;并將快照保…

daily notes[44]

文章目錄基礎references基礎 hello,world是幾乎所有編程語言的第一例子&#xff0c;rust也不例外。但和其它語言不一樣&#xff0c;Rust的源碼最好擁有自己的項目目錄。 $ mkdir ~/pro $ cd ~/pro $ mkdir helloWorld $ cd helloWorld源代碼文件名為main.rs&#xff0c;內容如…

JavaScript對象創建方式完全指南:從原始到現代的演進之路

前言 作為一名前端開發者&#xff0c;JavaScript中對象創建是很重要。在JavaScript這門基于原型的語言中&#xff0c;對象幾乎無處不在。今天&#xff0c;我將帶領大家回顧JavaScript對象創建的7種方式&#xff0c;從最原始的字面量到現代的ES6 class&#xff0c;每一步演進都解…

基于單片機的無線水塔監控系統設計(論文+源碼)

本設計為基于單片機的無線水塔監控系統設計&#xff0c;主要由以下幾部分組成&#xff1a;均采用STC89C52RC單片機為主控&#xff1b;主機&#xff1a;NRF24L01無線通訊模塊&#xff0c;1602LCD液晶顯示屏。從機&#xff1a;NRF24L01無線通訊模塊&#xff0c;水位傳感器&#x…

凌晨0-3點不睡,你熬的不是夜,是人生!

“熬夜”這個詞&#xff0c;早已成為現代生活的常態。有人為了工作加班到深夜&#xff0c;有人為了娛樂刷劇到天明&#xff0c;但你知道嗎&#xff1f;熬夜最“要命”的時間段&#xff0c;其實是凌晨0點到凌晨3點。別以為只是少睡幾個小時而已&#xff0c;這個時間段不睡&#…

大語言模型基石:Transformer

一、引言 如今火爆的 GPT、LLaMA、通義千問、ChatGLM 等大語言模型&#xff0c;背后都離不開一個核心架構——Transformer。 2017 年&#xff0c;Google 在論文《Attention Is All You Need》中首次提出 Transformer 模型&#xff0c;徹底改變了自然語言處理的發展方向。它摒…