1. 程式人生 > >一篇文章讓你瞭解MySQL

一篇文章讓你瞭解MySQL

一篇文章帶你讀懂MySQL

作為一名開發人員來說,資料庫知識是必不可少的,博主曾經年少無知的時候因為不瞭解資料庫而被京東拒之門;無論是基於檔案的Sqlite,還是工程上使用很多的MySQL、PostgreSQL/SQL Server;但是都沒有對資料庫有一個清晰的體系認識,所以拿出一段時間來研究資料庫,希望對看到這篇文章的各位能有所幫助;
在這裡插入圖片描述
MySQL是一個跨平臺的開源關係型資料庫,目前MySQL已經被廣泛的運用到中小型的網站專案中去,由於其體積小,成本低,速度快這些特點,尤其是開放原始碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站資料庫。隨著MySQL在網際網路上被廣泛使用,在資料庫領域的地位爆炸式的提升,大量的使用MySQL作為公司業務的資料庫;

MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體。

MySQL是一種關係資料庫管理系統,關係資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,分為社群版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。

由於其社群版的效能卓越,搭配 PHP 和 Apache 可組成良好的開發環境。

資料庫的定義

很多開發者對資料庫的概念其實是比較模糊的,覺得資料庫就是一些資料的集合,但是實際上卻比這個複雜的多;資料庫領域有兩個比較容易混淆的概念,就是資料庫和資料庫例項;
1.資料庫:物理操作檔案系統和其它形式檔案型別的集合;
2.資料庫例項:MySQL資料庫由一個後臺執行緒和共享記憶體組成;

MySQL的組成

Information_schema:資訊資料庫,提供了訪問時資料庫元資料的方式。那麼什麼是元資料呢?元資料是一些關於資料的資料;即資料庫的表名、列名、列的訪問許可權等;
MySQL:核心資料庫,提供了一些MySQL的核心資料,負責儲存資料庫的使用者和對應的許可權問題;
Performance_schema:效能優化庫

,mysql 5.5 版本 新增了一個性能優化的引擎: PERFORMANCE_SCHEMA這個功能預設是關閉的:需要設定引數: performance_schema 才可以啟動該功能,這個引數是靜態引數,只能寫在my.cnf 中 不能動態修改

資料庫和例項

在實際使用中,資料庫和例項往往是一一對應的,我們無法直接操作資料庫,我們操作的都是資料庫的例項,通過資料庫例項來操作資料庫的檔案;可以理解為資料庫為上層提供的一個數據庫例項的介面,用來操作資料庫檔案系統;
在這裡插入圖片描述
在Unix下,mysql的一個例項啟動會啟動兩個程序;mysqld就是真正的資料庫服務守護程序;另個mysqld_safe程序則是負責檢查和設定MySQLd啟動的控制程式,它負責監控MySQLd程序的啟動和執行,一旦mysqld程序出現錯誤,則有mysqld_safe程序嘗試重新啟動這個程序;

MySQL的架構

在這裡插入圖片描述
最上層的用於連線,執行緒處理的並不是MySQL發明的,而是很多服務都有的類似的功能,負責建立連線池,連線資料庫;
中間層包含了MySQL的大多數的核心業務,包括對sql的解析,分析和優化,資料庫的儲存過程,觸發器和檢視都是在這層來實現的;而第三層則是資料庫真正的負責資料庫的儲存和提取的引擎;

資料的儲存

這裡是關於資料庫的儲存引擎的介紹

索引

索引可以說是資料庫的祕密武器了,它是用來快速定位資料的重要武器,它對提升資料庫的服務、改善資料庫服務端的功能啟動重大的作用;索引優化是對查詢效能優化最有效的手段,它可以輕鬆將查詢優化好幾個數量級;
詳情見文章MySQL的索引

我們都知道鎖的種類分為樂觀鎖和悲觀鎖,InnoDB儲存引擎中採用的是悲觀鎖;而按照鎖的粒度來劃分,鎖分為行鎖和表鎖;
詳情見文章MYSQL的鎖

併發控制機制

樂觀鎖和悲觀鎖其實都是併發控制的機制,同時它們在原理上就有著本質的差別;

樂觀鎖是一種思想,它其實並不是一種真正的『鎖』,它會先嚐試對資源進行修改,在寫回時判斷資源是否進行了改變,如果沒有發生改變就會寫回,否則就會進行重試,在整個的執行過程中其實都沒有對資料庫進行加鎖;

悲觀鎖就是一種真正的鎖了,它會在獲取資源前對資源進行加鎖,確保同一時刻只有有限的執行緒能夠訪問該資源,其他想要嘗試獲取資源的操作都會進入等待狀態,直到該執行緒完成了對資源的操作並且釋放了鎖後,其他執行緒才能重新操作資源;
雖然樂觀鎖和悲觀鎖在本質上並不是同一種東西,一個是一種思想,另一個是一種真正的鎖,但是它們都是一種併發控制機制。
在這裡插入圖片描述
樂觀鎖不會出現後臺死鎖的現象,但是由於更新後再驗證資料,所以當衝突頻率和重試成本較高的時候,更推薦使用悲觀鎖;當需要很高的反應速度和併發量很大的時候,這個時候推薦使用樂觀鎖,使用悲觀鎖的話會存在效能問題;
在選擇併發控制機制時,需要綜合考慮上面的四個方面(衝突頻率、重試成本、響應速度和併發量)進行選擇。

鎖的種類

對資料的操作其實只有兩種,也就是讀和寫,而資料庫在實現鎖時,也會對這兩種操作使用不同的鎖;InnoDB 實現了標準的行級鎖,也就是共享鎖(Shared Lock)和互斥鎖(Exclusive Lock);共享鎖和互斥鎖的作用其實非常好理解:

共享鎖(讀鎖):允許事務對一條行資料進行讀取;
互斥鎖(寫鎖):允許事務對一條行資料進行刪除或更新;

而它們的名字也暗示著各自的另外一個特性,共享鎖之間是相容的,而互斥鎖與其他任意鎖都不相容;
稍微對它們的使用進行思考就能想明白它們為什麼要這麼設計,因為共享鎖代表了讀操作、互斥鎖代表了寫操作,所以我們可以在資料庫中並行讀,但是隻能序列寫,只有這樣才能保證不會發生執行緒競爭,實現執行緒安全。

鎖的粒度

死鎖的發生

既然 InnoDB 中實現的鎖是悲觀的,那麼不同事務之間就可能會互相等待對方釋放鎖造成死鎖,最終導致事務發生錯誤;想要在 MySQL 中製造死鎖的問題其實非常容易:
在這裡插入圖片描述
兩個會話都持有一個鎖,並且嘗試獲取對方的鎖時就會發生死鎖,不過 MySQL 也能在發生死鎖時及時發現問題,並保證其中的一個事務能夠正常工作,這對我們來說也是一個好訊息。

事務與隔離級別(重點,面試常問)

事務,顧名思義,即指的是一個完整的事務流程,事務的ACID四個特性也是基礎;
事務的隔離性是資料庫處理資料的幾大基礎之一,而隔離級別其實就是提供給使用者用於在效能和可靠性做出選擇和權衡的配置項。
詳情見文章MySQL的事務與隔離級別

總結

這篇文章的總體是將大家帶進MySQL的世界,細節的問題大家可以去看我的每個對應的文章,哪裡有遺漏的或者想了解的,歡迎大家留言;

在這裡插入圖片描述
/*************************************************************************
/*************************************************************************
此文章版權方是個人,目的是為自己記錄學習歷程的同時為大家提供一些參考;如果有不正確的地方,歡迎大家提出!

/*************************************************************************
/*************************************************************************