mysql-介紹、MySQL部署、數據類型、存儲引擎

數據庫介紹  html

什麼是數據?前端

  數據(data)是事實或觀察的結果,是對客觀事物的邏輯概括,是用於表示客觀事物的未經加工的原始素材。數據是信息的表現形式和載體,能夠是符號、文字、數字、語音、圖像、視頻等。數據和信息是不可分離的,數據是信息的表達,信息是數據的內涵。數據自己沒有意義,數據只有對實體行爲產生影響才成爲信息。數據能夠是連續的值,好比聲音,圖像成爲模擬數據。也能夠是離散的,如符號、文字、稱爲數字數據。在計算機系統中,數據以二進制信息單元0,1的形式表示。mysql

什麼是數據庫?算法

  數據庫(database):是按照數據結構來組織、存儲和管理數據的倉庫sql

什麼是數據庫管理系統(DBMS)?數據庫

數據庫管理系統:是由數據庫及其管理軟件組成的系統編程

  1.提供數據持久性的存儲,備份,恢復api

  2.支持事務管理緩存

  3.數據操做的併發安全

  4.支持獨立的管理語言(SQL語句)

使用數據庫的優點:

1.數據的獨立性:

  元數據的存儲,應用程序程序不需數據格式問題

2.數據的冗餘:

  最小化數據冗餘,保障數據的統一性和一致性

3.數據的安全:

  不一樣的用戶能夠看到獨立的數據

4.數據的利用率:

  使用結構化的數據管理語言(SQL語句)

5.簡單的數據備份和恢復:

  提供多種數據備份恢復方式,使數據的安全性更高

數據庫的分類:

  1.關係型數據庫(MySQL,Oracle,db2,sqlserver)

  2.非關係型數據庫(MongoDB,HBASE,Cassandra)

什麼是關係型數據庫

  關係數據庫,是簡歷在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。顯示世界中的各類實體以及實體之間的各類聯繫均用關係模型來標識。關係模型是由埃德加·科德於1970年首先提出的,並配合「科德十二定律」。先現在雖然對此模型有一些批評意見,但它仍是數據庫存儲的傳統標準。標準數據查詢語言SQL就是一種基於關係數據庫的語言,這種語言執行對關係數據庫中數據的檢索和操做。關係模型由關係數據結構、關係操做集合、關係完整性約束三部分組成。

  mariadb數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用gpl受權許可。開發這個分支的緣由之一是:甲骨文公司受夠了MySQL後,有將MySQL閉源的潛在風險,所以社區採用分支的方式來避開這個風險。

  MariaDB的目的是徹底兼容MySQL,包括API和命令行,使之能輕鬆成爲MySQL的代替品。在存儲引擎方面。10.0.9版起使用XtraDB(名稱代號爲:Aria)來代替MySQL的innodb。

  mariadb直到5.5版本,均依照MySQL的版本,所以,使用mariadb5.5的人會從MySQL5.5中瞭解到mariadb的全部功能。

  從2012年11月12日起發佈的10.0.0版開始,再也不依照MySQL的版號。10.0.x版以5.5版爲基礎,加上移植自MySQL5.6版的功能和自行開發的新功能。

  MariaDb的api和協議兼容MySQL,另外又添加了一些功能,以支持本地的費阻塞操做和進度報告。這意味着,全部使用MySQL的鏈接器,程序庫和應用程序也將能夠在mariadb下工做。

MySQL數據庫介紹

安裝方式不少,源碼安裝,yum包安裝,自行百度。

[root@localhost ~]# systemctl status mysqld
● mysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2018-09-25 12:08:45 CST; 2 weeks 3 days ago
 Main PID: 4630 (mysqld_safe)
    Tasks: 23
   CGroup: /system.slice/mysqld.service
           ├─4630 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           └─4757 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mys...

9月 25 12:08:23 localhost.localdomain systemd[1]: Starting MySQL Community Server...
9月 25 12:08:42 localhost.localdomain mysqld_safe[4630]: 180925 12:08:42 mysqld_safe Logging to '/v...'.
9月 25 12:08:42 localhost.localdomain mysqld_safe[4630]: 180925 12:08:42 mysqld_safe Starting mysql...ql
9月 25 12:08:45 localhost.localdomain systemd[1]: Started MySQL Community Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# 

修改/etc/my.cnf,在[mysqld]小節下添加一行:skip-grant-tables=1,重啓MySQL服務;

MySQL監聽端口爲:3306,MongoDB默認端口爲27017

簡單操做參考個人另外一篇博客:點擊進入

 體系結構介紹

 MySQL的架構

  所謂MySQL的架構指的是MySQL的邏輯架構,瞭解MySQL的邏輯架構能夠幫助咱們更好的理解MySQL是如何工做的,以及在MySQL工做過程中咱們須要注意的一些地方,而且理解一些有關於數據庫的基本概念和知識。

首先正如上圖,MySQL的邏輯架構主要分爲三層,分別爲服務層,核心層和存儲引擎層,首先在這張圖的最上邊,能夠看到有不少的客戶端鏈接着連接線程處理。連接線程處理這一層就稱之爲服務層,它主要的目的是爲客戶端請求作連接處理、受權認證、還有安全等等。那麼當咱們客戶端的連接請求被服務層處理以後,而且容許連接,就進入到執行工做的這一環節,那麼這些工做由核心層來進行完成。比方說下達一個查詢指令,查詢數據庫當中的記錄,那麼首先會進入到核心層的查詢緩存,先看看緩存當中有沒有對這條查詢語句的緩存信息,若是有,直接從緩存當中獲得答案,這速度的最快的,若是沒有,接下來能夠去查找分析器。

  分析器用來分析SQL語句,瞭解咱們到底要查找什麼,而且還會到優化器中優化咱們的SQL語句,最終再從新執行查詢。因此說核心層它的主要工做是查詢解析、分析咱們的SQL語句、優化SQL語句、緩存查詢的結果,以及全部的內建函數的存儲過程、觸發器還有視圖等等,都是在覈心層來完成的。最後是存儲引擎層。當咱們要查什麼東西這件事情被數據庫理解以後,那麼查這些數據呢就會涉及到數據庫的操做。存儲引擎這一層就是來完成這項工做的,它完成存儲和提取數據以及事務處理。

  接下來看一些具體的組成部分,首先來講客戶端,客戶端對於MySQL來說,它並非具體指某一個客戶端軟件。有些人可能就會認爲MySQL這個命令他就是MySQL的客戶端,其實這個並非精確的說法,實際上MySQL客戶端它是一種很是複合的一種概念,包含不一樣程序語言編寫的前端應用程序和所調用的api接口。或者能夠通俗的來說,只要可以鏈接數據庫而且能夠對MySQL進行操做的軟件,均可以稱之爲MySQL的客戶端。形象來說,比方說假設一個網站使用lnmp的環境,其中中間件使用的是PHP,而PHP經過調用PDO這個組件,能夠鏈接MySQL的數據庫。這個時候就能夠說PHP這個中間件它就是一種MySQL客戶端。

  客戶端:

  1.MySQL客戶端並不具體指某個客戶端軟件、

  2.實際上MySQL客戶端是一種符合的概念。包含

    (1.不一樣程序語言編寫的前端應用程序;2.所調用的api接口)

  服務層在這裏主要完成線程的管理,是服務是爲連接線程進行處理,爲客戶端請求作連接處理、受權認證等等。這一系列都在操做系統這個層面上由線程來進行完成。MySQL是一種單進程,多線程的軟件。在這裏假如說有一個連接,連接過來以後,正如這個圖所看到的,進程中能夠建立出新的線程,或者說派生出一個新的線程,爲這個鏈接來提供服務。可是並非全部的連接均可以獲得新建立出的線程,由於建立線程和消除線程自己也是一種消耗系統資源的行爲,因此MySQL會很是聰明的建立出一種叫作線程緩衝池的東西,把已經被使用過的線程,如今不用了,先緩存在緩衝池裏面,接下來有新的連接過來,那麼MySQL會有限的使用線程緩衝池中的線程爲用戶提供服務,這樣就大大節省了相應的系統資源,讓MySQL可以承受更大併發量的訪問,這也是MySQL很是優秀的一點。

 

  在上圖當中,對MySQL下達一個查詢以後,具體的執行過程會是什麼?一個查詢過來每每對應的就是在SQL語句當中的一句select語句,那麼MySQL會嚴格匹配這條select語句,若是在緩存當中發現了有如出一轍select語句的結果緩存的話,那麼就能夠經過緩存的方式直接返回給用戶結果,這是查詢最快的一種方式,若是沒有緩存的話,那麼它就會走左邊的這個分支,首先它要解析查詢,理解下達的這個select語句是什麼意思,要查什麼表,查什麼字段,或者說要作多表查詢的話,是那些表聯合成什麼樣子?是否須要作排序?是否須要作分組?或者是其它的,接下來它會優化你的select語句,就是根據本身數據庫當中的數據結構和存儲來優化select語句執行的方式,讓它以最好的效率來執行,優化好相應的語句以後,再去執行查詢,而且把查詢的結果返回給用戶。一樣查詢結構也能夠被緩存到緩存當中。以方便下次若是來了一樣的查詢,能夠快速的獲得結果。就不須要再走左邊分支這麼多的步驟了。

 

  存儲引擎層比較值得咱們關注的是這個可插式存儲引擎,這個是MySQL很是好的一個特色,由於不一樣的存儲引擎它的特性、功能、和使用範圍是不同的。MySQL能夠根據相應不一樣數據的特性來選擇合適的存儲引擎,使用者也能夠很是方便的去挑選不一樣存儲引擎來完成本身的工做,存儲引擎就是查詢管理操做數據的東西,數據都要存儲在當前的存儲設備當中,在存儲設備當中具體體現爲一個個的文件,那麼這些數據相應的包含了MySQL數據庫的數據文件,還包含了不少相應的日誌,這些都是由MySQL所產生的,所以可插式存儲引擎能夠支持多種的文件系統,包含在Linux中經常使用的ext系列文件系統,NTFS等等,這些都是能夠經過存儲引擎來進行使用,另外存儲引擎還能夠處理文件和日誌,好比說索引文件、二進制文件、慢查詢日誌等等,這些都是由存儲引擎最終寫入到存儲當中的。

整個MySQL邏輯架構的總圖

  咱們能夠把它們集合在一塊兒再來看一下,首先最上面這個叫作支持接口,支持的接口包含標準C的API,JDBC,ODBC等等應用程序的API接口,這些接口會被相應的客戶端應用程序所調用,用來鏈接到MySQL數據庫。那麼MySQL server當中第一個處理這些連接的就是鏈接池,剛纔提到過了,鏈接池用來緩存相應的線程,每個鏈接都提供線程爲其進行服務,那麼在這個服務過程中完成了驗證受權、連接限制、內存緩存管理等等一系列的功能,再接下來右邊有一個豎列表示企業管理服務和工具,好比說備份恢復、安全、複製、集羣、分區管理、事例管理等等,這些都是相應MySQL內檢的功能或者工具,甚至有一些是單獨的命令,它們參與了這方面的管理,再往下能夠看到四個重要的組成部分,分別是SQL接口、解析器、優化、緩存和緩衝池,首先來着看這個SQL接口,這個是數據管理語言和數據定義語言、存儲過程、視圖、觸發器等等,這些SQL接口支付了相應SQL語句的實現,也就是下達的SQL語句指令,就是由這裏來進行功能上的支持,在功能支持的基礎之上要用到第二個組成部分,就是這個解析器,解析器對查詢以及相應帶的事務對象進行優先級的劃分,而且SQL語句進行優化,解釋理解這些SQL語句,最終放到優化的這個組成部分當中,解釋清楚了以後才能進行優化,因此說這個優化就是對訪問路徑、統計等等進行優化操做。而後在旁邊能夠看到緩存和緩衝池,它用來緩存對MySQL進行操做的結果,包括查詢緩衝以及其餘各類類型的緩衝,用來加快數據執行的效率。

  再往下面就是MySQL的特色,很好地一個特性就是可插式存儲引擎,在這裏它能夠支持多種不一樣的存儲引擎,能夠把它形象的理解成爲:當要操做某一個數據的時候,上面這一層就會調用其中一個存儲引擎,好想一個插銷同樣,查到下面存儲這一層上來了,而存儲這一層就是相應的文件系統、文件日誌等等這些系統層面的東西。那麼這一層就是把MySQL與當前系統當中的文件這一層鏈接在一塊兒的這麼一個環節,它也是很是重要的。以上就是MySQL相應的邏輯架構,連接這個邏輯架構以後。經過這個邏輯架構能夠更好的去理解MySQL對一些行爲的處理方式,好比說事務處理。

 結構化查詢語言SQL

   結構化查詢語言(縮寫SQL),是一種特殊母的之編程語言,用於數據庫中的標準數據查詢語言,IBM公司最先使用在其開發的數據庫系統中國, 1986年10月,美國國家標準學會對SQL進行規範後,以此做爲關係式數據庫管理系統的標準語言,1987年獲得國際標準組織的支持下成爲國際標準。不過各類同行的數據庫系統在其實踐過程當中都對SQL規範做了某些改編和擴充。因此,實際上不一樣數據庫系統之間的SQL不能徹底相互通用。

  SQL是高級的非過程化編程語言,它容許用戶在高層數據結構上工做。它不要求用戶指定對數據的存放方法,也不須要用戶瞭解其具體的數據存放方式。而它的界面,能使具備底層結構徹底不一樣的數據庫系統和不一樣數據庫之間,使用相同的SQL做爲數據的輸入與管理。它以記錄項目【records】的合集(set)項集【record set】做爲操縱對象,全部SQL語句接受項集做爲輸入,回提交的項集做爲輸出,這種項集特性容許一條SQL語句的輸出做爲另外一條SQL語句的輸入,因此SQL語句能夠嵌套,這使它擁有極大的靈活性和強大的功能。在多數狀況下,在其餘編程語言中須要用一大段程序纔可實踐的UI個單獨實踐,而其在SQL上只須要一個語句就能夠被表達出來。這也意味着用SQL能夠寫出很是複雜的語句。

 SQL分類 

  • 數據查詢語言(DQL)
  • 數據定義語言(DDL)
  • 數據操縱語言(DML)
  • 數據控制語言(DCL)

數據庫基本操做

1.數據查詢語言(DQL)

數據查詢語言(DQL)是SQL語言中,複製進行數據查詢而不會對數據自己進行修改的語句,這是最基本的SQL語句。

語法結構:

SELECT [要提取的字段名,或使用「*」表明所有的字段]
FROM [要提取的資料的來源,包含表或視圖名等]  -- 可搭配JOIN作關聯式鏈接
WHERE [提取的過濾條件] -- WHERE 無關緊要
GROUP BY [要分組的字段] -- GROUP BY 對數據進行分組時使用
HAVING BY [要作分組的字段] -- 要使用聚合函數做爲條件時使用
ORDER BY [要排序的字段與方向] -- ORDER BY 無關緊要,若沒有則是按照查詢引擎的輸出排序爲主

2.數據定義語言(DDL) 

數據定義語言(DDL)是SQL語言中,負責數據結構定於與數據庫對象定義的語言,由CREATE、ALTER與DROP三個語法組成,最先是由Codasyi數據庫模型開始,如今被歸入SQL指令中國做爲其中一個子集。

語法結構:

CREATE 能夠用來建立用戶、數據庫、數據表、視圖、存儲過程、存儲函數、觸發器,索引等。
ALTER 是負責數據庫對象修改的指令
DROP 是刪除數據庫對象的指令,只須要指定要刪除的數據庫對象名便可

3.數據操縱語言(DML)

數據操縱語言(DML)是SQL語言中,負責對數據庫對象進行數據訪問工做的指令集,以INSERT、UPDATE、DELETE三種指令爲核心,分別表明插入,更新與刪除。

語法結構:

INSERT 是將數據插入到數據庫對象中的指令,能夠插入數據的數據庫對象有數據表以及可更新查看錶兩種。
UPDATE 指令是依給定條件,將匹配條件的數據表中的數據更新做爲新的數值。
DELETE 是爲數據庫對象中刪除數據的指令

4.數據控制語言(DCL)

數據控制語言(DCL)在SQL語言中,是一種能夠對數據訪問權進行控制的指令,它能夠控制特定用戶帳戶數據表、查看錶、預存程序、用戶自定義函數等數據庫對象的控制權。由GRANT 和 REVOKE 兩個指令組成。

DCL以控制用戶的訪問權限爲主,GRANT 爲受權語句,對應REVOKE是撤銷受權語句。

具體操做看以前的幾篇博客。。。

 

什麼是數據類型?

數據有着不一樣的分類,比方說,數字這是一種類型的數據,字符是一種類型的數據,日期是一種類型的數據,那麼這種不一樣類型的數據,數據庫處理的方式,好比說如何進行存儲,如何進行查找,如何限定它的長度,甚至存儲的一些方式還有算法都不盡相同,因此對於數據庫來說須要定義不一樣的數據類型,而後根據數據類型再去作相應的操做,這就是數據類型。

定義數據類型本質上是再定義列

所謂的定義數據類型,其實就是指在建立表格的時候,告訴數據庫這張表有哪些個列,或者稱之爲叫有哪些字段,那麼每一列存儲的數據是什麼類型的,因此咱們能夠這樣說,定義數據類型的本質,其實就是在定義列。

 數據分類的意義

分配合適的存儲空間:

  不一樣數據類型所佔用的存儲空間時不同的,甚至同一種類型的數據的多種不一樣子分類,它所佔的空間也是不一樣的,這個技術實現是有相應的關係的,因此數據須要分類。

採用不一樣的操做方法:

  比方說若是把一個日期2014年1月1日以數字的形式存放到數據庫當中,那麼就是20140101,對於數據庫來說它只是一串數字,而若是以日期的方式存放到數據庫當中,那麼數據庫就會知道2014是年,01是月,最後一個01是天,就具體有着不一樣的含義了,那麼就決定了最終的操做方法,好比說像查找2013年12月31日晚上的時間的時候,這個時候日期類型就能夠匹配出來,而數據類型就作不到這一點。

對應不一樣的需求:

  若是存放的僅僅是一個姓名的狀況下,那麼這種數據每每最多也就是3,4個字,還沒見過我們國人的名字有七八十個字的。可是若是存放的是我的簡介,相應的這個數據類型只能存10,11個字的話就不合適了,多是一兩百個字。這時候就須要另一種數據類型,因此說數據分類也是對應不一樣的需求。

整數類型:

MySQL中提供多種對於數值的數據類型

不一樣的數據類型取值範圍不一樣

取值範圍越大,須要的存儲空間也越大。

 存儲帶小數的類型:

浮點數和定點數類型用來存儲帶小數的數值

使用(M,D)的方式設定M精度(或顯示總位數)和D標度(小數的位數)

定點數就是規定相應的數值所存儲數據的長度和精度,因此它消耗的存儲數值的長度是不固定的,由規定的範圍來決定,它的算法就是,當M>D的時候M+2,M<D的時候D+2。(3,2)消耗五個字符,它的方位取決於咱們給它定義的M和D。

超出精度範圍會採用四捨五入

超出值範圍會報錯

double和float區別不大,只是範圍更廣,有意思的是定點數。

M最大值65,D最大30,最多的整數位35,和30位小數。默認D爲0 M爲10

日期和時間的類型

MySQL中提供多種用於存儲日期和時間的類型

根據需求,並注意格式。

 用單引號,mysql就會將0做爲年份最右邊的數字,若是是4位的年,就會轉換爲2000年,由於四位的年份是從1901到2155,MySQL會盡量匹配更多的零,4個0是非法的,由於沒有4個零的年,兩位數也是同樣的。

TIME:

-838:59:59 到838:59:59 time不是表示咱們一般意義上的24小時,二十表示已通過去了的時間,或者是過去了多少時間,花費了多少時間,因此計數的角度能夠超過24小時

 DATE

歷史年份,公元,date沒法解決

 DATETIME時間是24小時的。8個字符,TIME + DATE 6個字符。節省兩個字節

TIMESTAMP根據當地時間計算,會受到系統時區的影響。

生產環境中只要全部的服務器與時間服務器進行同步就不會有問題。TIMESTAMP只佔用4個字節。是全部日期和時間類型中最節省的。

字符串類型:

1.字符串類型是一個統稱,包含多種不一樣數據類型

2.分爲文本字符串類型和二進制字符串類型。

3.不只能夠存儲字符串,還能夠存儲其它數據。

4.字符串能夠區分或不區分大小寫的串比較

5.支持進行模式匹配查找。

CHAR(M)長度是固定的,M規定字符串的長度

VARCHAR(M)

concat() 合併字符串的函數


 

MySQL5.5以後,開啓STRICT_TRANS_TABLES。考慮到在某些嚴格的狀況下,錯誤字符串的截斷可能致使數據不完整,或數據的意義發送損壞,因此與其插入錯誤的損壞的數據,不如不讓插入。設計數據庫的時候記得查看默認的SQL mode是什麼。

ENUM類型,又稱爲枚舉型

ENUM類型存儲的數據比如是單項選擇題的選項。其存儲的值爲表建立時在列規定中枚舉的一列值,給出幾個選項,執行插入規定的值。

 SET類型

與ENUM很類似

ENUM類型存儲的數據比如是多項選擇題裏面的選項。其存儲的值爲表建立時規定的一列值。

選擇合適的數據類型 

剛纔上面所寫的只是MySQL中一部分數據類型,更多的數據類型能夠查看MySQL的官方手冊。有那麼多的數據類型,在什麼狀況下應該使用什麼數據類型呢?

字符串類型的選擇

1.不一樣的數據引擎,選擇傾向不一樣。

  1)MYISAM的選擇

  2)innodb的選擇

  3)MEMORY的選擇

2.不一樣的用途,選擇傾向不一樣

  1)CHAR:很短的字符,常常變動的內容

  2)VARCHAR:與上條相反

 存儲引擎 

MYISAM

MYISAM,是一種很是適合讀多寫少的數據引擎,讓myisam讀取char定長字符類型的時候,效率比varchar好得多。由於varchar是可變的,全部在查varchar數值的時候還要去查找數據結尾的位置,char是定長的能夠節省查找的步驟,因此char效率會高於varchar。

InnoDB數據引擎 

innodb數據引擎技術實現上是與MYISAM不同的。char和varchar區別不大,這時varchar可變長度的優點就展示出來了。varchar是可變長度,所以更節省空間。例如char(10)不管存儲多少都是10長度,varchar(10)能夠根據實際長度存儲。所以varchar更節省存儲。

Memory數據引擎  

將數據存儲在內存中,由於內存空間更爲寶貴,那麼varchar更合適使用。讀取char和varchar的效率能夠忽略,由於存儲的速度要遠遠高於磁盤的速度。

- 不一樣的用途,選擇傾向不一樣。

  CHAR:很短的字符,常常變動的內容

  VARCHAR:與上條相反

若是存放3,5個字符定長和變長的差異不大,差不了幾個字符,能夠選擇char。

浮點數和定點數的選擇

1.精度要求不一樣,選擇大不一樣

2.相比較而言,定點數的計算代價要昂貴的多。

單精度float和雙精度double精度範圍是不同的,根據存放浮點的範圍選擇。定點數,用於匯率,工資,收益比值。

大數據類型的選擇 

 1.能不用盡可能不用

    2.TEXT和BLOB有不少替代選擇

    3.若是存在常常的刪除和更新,建議按期使用potimize table進行碎片整理。

存放的數據很是很是長。TEXT和BLOB能不用盡可能不用。若是真的很長很長,能夠靜態化成一個個文本文件,而後經過數據庫記錄下這個文件的位置,去使用操做系統讀取相應的文件來獲得數據,效率更高。存數據庫效率低不少。

電影能夠存到MySQL中,二進制存放,可是效率很低。要從數據庫中取出來,而後在內存中組成一個文件,在提交給相應的應用程序處理,不如以視頻文件的形式存放在系統中,經過應用程序直接讀取。

論壇,改貼,刪帖。就會產生數據空洞。使用optimize table進行碎片清理。

日期類型的選擇  

TIMESTAMP佔用空間最少。可是注意它的特性

和時區有關,注意全部服務器的時區要一致。這個特性是全球化應用的好處。

但願存放的內容以當地時間的方式展現,惟一的選擇就是TIMESTAMP

存儲引擎  

  MySQL中的數據用各類不一樣的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。經過選擇不一樣的技術,你可以得到額外的速度或者功能,從而改善你的應用的總體功能。

MYISAM

  1. MySQL5.5.5以前的默認存儲引擎
  2. 支持大文件,一般默認是256TB。(相應操做系統實現的限制)
  3. 適合讀多寫少的應用場景
  4. 每一個MYISAM表的最大索引數是64,能夠經過編譯改變
  5. BLOB和TEXT類型能夠被索引
  6. 支持全文索引(只有MYISAM支持全文索引)
  7. 僅支持表鎖(不管是讀鎖仍是寫鎖)
  8. 非事務性引擎
  9. .frm文件存儲表定義,.MYD數據文件,.MYI索引文件

InnoDB:

  1. 目前MySQL的默認存儲引擎
  2. 事務性引擎
  3. 支持行鎖和外鍵
  4. 爲巨大數據量的最大性能設計
  5. .ibdata1自動擴展數據文件。ib_logfile0/1日誌文件

t_1這個表就是使用InnoDB存儲引擎建立的,t_1.ibd就是這個存儲引擎存放數據的文件。並且這個文件是自增加的,就是隨着數據庫增大,這個文件也就不斷的增大,固然也能夠經過其它手段對它進行修改。

MEMORY

  1. 將數據存儲到內存中的存儲引擎
  2. 不支持BLOB和TEXT列
  3. 非事務性引擎

另一個須要注意的一點事,內存是一個斷電不受保護的存儲,因此若是一下停電了。這個數據就會丟失。通常MEMORY用來存放一些不須要持續性的存儲,須要讀寫很是頻繁的數據。好比說session的值,操做id,操做編號這些數據放到MEMORY存儲引擎中。

 

最後還有NDB存儲引擎,NDB是用於MySQL Cluster的集羣存儲引擎,它可以提供數據層面上的高可用性,這個事MySQL Cluster當中必須會使用到的一種存儲引擎,固然NDB引擎對於多表查詢等複雜性查詢性能相對來講並非很優點。好比說它對複雜性查詢速度相比較MYISAM和InnoDB來說都差很少,尚在不斷完善中。。。

NDB

  1. 用於MySQL Cluster的集羣存儲引擎
  2. 提供數據層面上的高可用性
  3. 例如多表查詢等複雜性查詢性能相對不是頗有優點
  4. 尚在不斷完善中。。

 

MySQL事務處理

什麼是事務?

  • 事務是有一組SQL語句組成的邏輯處理單元
  • 原子性
  • 事務是一個原子操做單元,其對數據的修改,要麼全都執行,要麼全都不執行。
  • 一致性
    • 在事務開始和完成時,數據都必須保持一致的狀態
  • 隔離性
    •   數據庫系統提供必定的隔離機制,獨立執行
  • 持久性
    •   事務完成以後,它對於數據的修改是永久性的,及時出現系統故障也可以保持。這一點是很是重要的

MySQL的併發控制 

  下面來看看MySQL的併發控制,這個MySQL的併發控制能夠解釋爲何事務是須要隔離的,爲何數據要是一致的,最後數據必定要是完整的緣由。

多事務執行方式

好多好多的請求到來,好多好多的工做要作,怎麼辦?

  • 串行執行
  • 交叉併發執行
  • 同時併發執行

併發控制

  • 對併發操做進行正確調度
  • 保證事務的隔離性
  • 保證數據的一致性

相應多事務併發到來的時候對事務的處理方式

  • 同一時間只有一個事務運行
  • 效率低,沒法充分利用資源

交叉併發執行

  • 多事務交叉運行
  • 單處理器的併發方式

同時併發執行

  • 多處理器系統中使用
  • 每一個處理器處理一個事務

併發執行致使的問題

  • 併發勢必面臨「同讀同寫」問題
  • 「同讀同寫」致使破壞事務隔離性和數據不一致

 

基本鎖類型

  • 讀鎖
    • 又稱共享鎖
    • 當事務1對某個數據對象加讀鎖,則其它事務只能對此數據對象加讀鎖,不能加寫鎖。直到事務1釋放鎖
  • 寫鎖
    • 又稱排它鎖
    • 當事務1對某個數據對象加寫鎖,則其它事務都不能對此數據對象加任何鎖

鎖也是分類的,最基本的類型分爲兩種:一種是讀鎖,一種是寫鎖。顧名思義,讀鎖,就是對某個數據對象進行讀的時候加個鎖,讀鎖又稱爲共享鎖,其它事務只能對此數據對象加讀鎖,補不能加寫鎖。直到事務1釋放鎖。第二個是寫鎖,寫鎖又稱之爲排它鎖,當事務1對某個數據對象加寫鎖,則其它事務都不能對此數據對象加任何鎖。又稱之爲獨佔鎖。那麼就這兩種鎖就是用來解決前面舉得這幾種發生數據不一致性的例子。      


 

事務transaction指定一組SQL語句

回退rollback撤銷指定的SQL語句(只能回退insert delete update語句)

提交commit 提交未存儲的SQL語句

保留點savepoint事務處理中設置的臨時佔位符,你能夠對它發佈回退(與整個事務回退不一樣)

示例。。略

事務的最後結果,要麼是commit,要麼是rollback

若是發生錯誤,或者數據庫重啓了,系統重啓了,就作rollback

 

 

 如何查看數據庫的已經使用的大小呢?

在Linux中能夠用:du命令

du -sh:查看當前數據庫使用的總大小

 

 

 

後續持續更新中。。。

相關文章
相關標籤/搜索