Palai

Palai

程序员 | 开源爱好者 | 喜欢交友

MySQL - 初識小記

遇見#

大家可以先呼出自己的任務管理器(我是 Windows,快捷鍵 CTRL + SHIFT + ESC)--> 第一欄第一個就是進程。

圖片

什麼是進程?#

進程是資源分配的基本單位,是操作系統的一個執行單元,我們的電腦上有很多的程序,比如微信、QQ、網易雲音樂等,每一個正在運行的程序可以被稱為一個進程。每個進程都有獨立的內存空間、代碼和數據;每個進程都有一個唯一的進程 ID。如果你的電腦開啟了 MySQL 服務的話,進程裡面就能找到 MySQL 的進程 ID 了 --->mysqld。如圖所示

mysqlid
(我有兩個是因為我安裝了兩種版本的 MySQL,一個是 5.7,一個是 8.0)

連接 MySQL#

按下 win+r,輸入 “cmd” 打開命令行窗口,輸入:

mysql -hlocalhost -u root -p

-hlocalhost 如果是在自己電腦上的話也可以省略,-u 後面可以有空格,但是 - p 後面不能有。上面隱式輸入密碼,不會被別人看見,按下回車之後,接下來輸入密碼就可以了。

進程間通信的方式?#

我用風趣幽默的詞來表達吧,如果想看正式一點的可以看下面。

  1. 管道(Pipe):想像一下,兩個進程在用一根吸管傳遞秘密信息。管道是單向的,數據只能從一端流向另一端,就像吸管裡的果汁一樣。

  2. 命名管道(Named Pipe):這是管道的升級版,它有名字了!這樣,不同的進程就可以通過這個名字找到它,進行雙向通信,就像兩個人用對講機一樣。

  3. 信號(Signal):進程之間的拍手遊戲。一個進程給另一個進程發送一個信號,告訴它發生了什麼事件,就像拍手表示 “你被發現了”。

  4. 消息隊列(Message Queue):進程間的郵局。進程將消息放入隊列,另一個進程從隊列中取出消息。就像寄信一樣,只不過這個郵局的效率非常高。

  5. 共享內存(Shared Memory):進程間共享一塊內存空間,就像一塊公共的黑板,大家都可以在上面寫字和擦掉字。這種方式速度很快,但要注意避免寫字時的混亂。

  6. 套接字(Socket):進程間的電話。套接字允許不同進程、甚至不同計算機之間進行通信,就像打電話一樣。只要知道對方的電話號碼(IP 地址和端口號),就可以開始通話了。


管道 pipe: 管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。
命名管道 FIFO: 有名管道也是半雙工的通信方式,但是它允許無親緣關係進程間的通信。
消息隊列 MessageQueue: 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
共享內存 SharedMemory:共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
套接字 Socket: 套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。
信號 (sinal) : 信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生。

MySQL 支持進程間的通信方式?#
  • 命名管道和共享內存
  • Unix 域套接字文件
  • TCP/IP:通過 IP + 端口號來進行通信,本質上屬於 “套接字 Socket” 通信

進程和端口號是兩個不同的概念,端口號是用於在網絡通信中標識特定進程的數字,也就是說並非每個進程都有端口號,而是那些需要進行通信的進程才會使用端口號。端口號可以預先分配,比如 HTTP 通信的 80 端口,而 HTTPS 是 443,我們的 MySQL 服務啟動的時候會默認申請 3306 端口號

MySQL 存儲引擎#

這裡先來聊聊存儲引擎吧,畢竟數據都是存在存儲引擎裡面的。
這裡只談兩個比較常見的:InnoDB 和 MyISAM

InnoDB:

  1. 支持事務(Transaction):InnoDB 提供了提交(commit)和回滾(rollback)功能,確保數據的完整性和一致性。
  2. 支持行級鎖定(Row-level Locking):在並發操作時,InnoDB 可以鎖定被修改的單行數據,提高了並發性能。
  3. 支持外鍵(Foreign Key):InnoDB 支持引用完整性約束,有助於維護數據庫的關係完整性。
  4. 支持 MVCC(多版本並發控制):這有助於在高並發場景下提高讀取性能。

MyISAM:

  1. 不支持事務:MyISAM 不提供事務支持,因此在需要事務處理的場景中不太適用。
  2. 表級鎖定(Table-level Locking):MyISAM 在進行寫操作時會鎖定整個表,可能導致並發性能較低。
  3. 不支持外鍵:MyISAM 不支持引用完整性約束。
  4. 更小的存儲空間:MyISAM 通常佔用較少的磁盤空間,因為它不需要存儲事務和行級鎖定的相關信息。

InnoDB 與 MyISAM 的異同:
相同點:

  1. 都是 MySQL 的存儲引擎,用於存儲和管理數據。

不同點:

  1. 事務支持:InnoDB 支持事務,而 MyISAM 不支持。
  2. 鎖定機制:InnoDB 使用行級鎖定,MyISAM 使用表級鎖定。
  3. 外鍵支持:InnoDB 支持外鍵,而 MyISAM 不支持。
  4. 存儲空間:InnoDB 通常佔用更多的磁盤空間,而 MyISAM 佔用較少。
  5. 並發性能:InnoDB 在高並發場景下通常表現更好,因為它支持行級鎖定和 MVCC。

根據不同場景選擇不同的存儲引擎,如果需要事務支持和高並發性能,InnoDB 會更好一點。如果不需要事務支持,且對存儲空間有較高要求,可以考慮使用 MyISAM。

最後我想談的一點區別是:

在 InnoDB 中,數據即索引,索引即數據;而在 MyISAM 中,索引是索引,數據是數據。

稍微解釋一下:

  1. InnoDB 中的 "數據即索引,索引即數據":InnoDB 使用聚簇索引來存儲數據。在聚簇索引中,數據行與主鍵索引緊密結合在一起,按照主鍵的順序存儲。這意味著數據和索引實際上是一體的,無法分離。當我們查詢數據時,通過主鍵索引就可以直接找到對應的數據行,無需額外的數據查找過程。

  2. MyISAM 中的 "索引是索引,數據是數據":MyISAM 使用非聚簇索引來存儲數據。在非聚簇索引中,數據行和索引是分開存儲的。索引中只包含索引鍵值和指向實際數據行的指針。當我們查詢數據時,首先需要在索引中查找,然後通過指針找到實際的數據。這個過程被稱為 "回表"。

總結一下,InnoDB 中的數據和索引是緊密結合在一起的,查詢時無需額外的數據查找過程。而在 MyISAM 中,數據和索引是分開存儲的,查詢時需要通過索引找到數據行的指針,然後再獲取實際的數據。這就是 "InnoDB 中數據即索引,索引即數據;而在 MyISAM 中,索引是索引,數據是數據" 的含義。

😭#

先寫這點吧,碼字還是比較耗時間的,感覺寫著寫著都是很常見的內容,再往後也是,有點不知道要怎麼分享了😰。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。