MYSQL基礎

一、MySQL邏輯架構

    MySQL的邏輯架構主要包含三層。最上層的應用層,主要基於網絡客戶端/服務器的工具或者服務,比如連接認證,授權認證,安全等功能。

    第二層是MySQL的核心服務功能層,包括查找解析,分析,優化,緩存以及所有的內置函數等,除此之外,所有的跨存儲引擎的功能都在這一層實現:存儲過程,觸發器,視圖等。

    第三層是存儲引擎層,主要負責MySQL中數據的存儲與提取,主要是Innodb存儲引擎和MyIsam存儲引擎,存儲引擎之間不會相互的通信,只會響應上層服務器的請求。注意區分不同存儲引擎的優劣。

    具體而言,下圖更加清晰。主要包括(由上至下):連接池組件,管理服務和工具組件,SQL接口組件,查詢分析器組件,優化器組件,緩存組件,存儲引擎,物理文件。

 

二、MySQL中併發控制

    MySQL中的併發控制主要是由鎖機制來實現互斥的作用。

  1. 讀寫鎖。讀鎖(又稱爲共享鎖)是相互不阻塞的,可以允許多個客戶在同一時刻讀取同一個共享資源;寫鎖(又稱爲排他鎖)是會阻塞其他的寫鎖和讀鎖,主要是爲了保證,在同一時刻,一個用戶寫共享資源,防止其他用戶對這個共享資源的讀寫,以此會造成數據的不一致性。
  2. 鎖粒度,提高鎖併發性的方式就是讓鎖定對象更加有選擇性,儘量讓鎖鎖定部分數據,而不是所有數據,在一定的資源中,鎖定的數據量越少,系統的併發程度越高,相互之間不發生衝突即可。
  3. 鎖策略,指的是在鎖的開銷和數據安全性之間尋找平衡。兩種最重要的鎖策略是表鎖和行級鎖。表鎖是開銷最小的鎖策略,一旦鎖定就會鎖定整個表,只要一個用戶對某個表進行插入、刪除、更新等操作,就要先獲得寫鎖,同時也會阻塞其他用戶對該表的所有讀寫操作。只有沒有寫鎖的時候,其他用戶纔可以獲得讀鎖,讀鎖之間是相互不阻塞的。行級鎖是可以最大程度的支持併發處理,當讀寫的時候,是要對要讀取的那一行或者幾行進行加鎖和解鎖。行級鎖只有在存儲引擎層才實現了,不同存儲引擎對其實現也有不同。

三、事物與隔離級別

    事物就是一組原子性的sql語句集合,或者說一個獨立的工作單元,當存儲引擎能處理完事物中的所有語句,那麼才執行改組語句,如果任何一條語句無法執行,則所有語句則不會執行。事物中的語句要麼全部執行,要麼全部不執行。

    事物的特徵:ACID(Atomicity,Consistency,Isolation,Durability)

  1. 原子性,指的是一個事物操作可視爲一個不可分割最小工作單元,事物中的語句要麼全部提交成功,要麼全部回滾
  2. 一致性,指的是一個數據庫的狀態從一個一致性狀態轉換到另一個一致性狀態,由事物的回滾操作和提交操作保證
  3. 隔離性,指的是兩個事物之間的隔離級別(四種)
  4. 持久性,一旦一個事物提交了以後,其所作的修改會永久保留在數據庫中

    SQL標準中規定了四種隔離級別,指的是,一個事物的操作對另一個事物是否可見。

  1. (READ UNCOMMITTED)未提交讀,一個事物中的修改即使沒有提交,對其他事物也是可見的。這種隔離級別一般不用,因爲容易產生髒讀(指的是事物A修改了某條數據data,此時未提交,然後另一個事物B讀取了這條數據data,然後事物A回滾,即不承認對數據data做了修改,此時事物B所讀的數據則爲髒讀)
  2. (READ COMMMITTED)提交讀,也成爲不可重複讀,一個事物從開始到提交之前,所做的任何修改對其他事物不可見。大部分的數據庫系統默認爲提交讀隔離級別。
  3. (REPEATABLE READ)可重複讀,保證在同一個事物中多次讀取同樣的記錄結果是一樣的(對一條記錄而言)。此級別解決了髒讀問題,但是無法解決幻讀問題(即一個事物讀取某個範圍內的記錄,另一個事物又在該範圍中插入新的記錄,當前事物再次讀取該範圍內記錄會產生幻行,比如事物A讀取了某個範圍N條數據,事物B在這個範圍內增加M條符合事物A讀取條件的數據,當事物A再次讀取該範圍即會讀到M+N條數據)。此級別解決了髒讀問題,但是又產生了幻讀問題。
  4. (SERIALIZABLE)可串行化,強制事物串行執行,可避免髒讀和幻讀問題

    多版本併發控制(MVCC)可以看成行級鎖的一個變種,他在很多情況下避免了加鎖操作,因此開銷比普通行級鎖更低。不管執行多長時間,MVCC保證每個事物看到的數據都是一致的,爲的是解決這個問題:根據事物開始時間不同,每個事物對同一張表,同一時刻看到的數據可能不一樣。MVCC有兩種機制,樂觀併發控制和悲觀併發控制。

四、端口

     mysql默認端口3306,利用show global variables like 'port';語句可以查看mysql的端口。通過編輯/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口參數,並且設定端口,注意該端口未被使用,保存退出。

五、InnoDB和MylSAM

   

  InnoDB MyISAM
事物 支持 不支持
表鎖 支持行級鎖 僅支持表鎖
全文索引 不支持 支持
聚集索引 支持 不支持
緩存 支持緩存索引和表數據 僅支持緩存索引

 

參考 《高性能Mysql》《Mysql技術內幕 InnoDB存儲引擎》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章