MySQL 高級性能優化架構 千萬級高併發交易一致性系統基礎

1、MySQL體系架構


由圖,能夠看出MySQL最上層是鏈接組件。下面服務器是由鏈接池、管理服務和工具組件、SQL接口、查詢解析器、查詢優化器、緩存、存儲引擎、文件系統組成。mysql

一、鏈接池 管理、緩衝用戶的鏈接,線程處理等須要緩存的需求。鏈接池的做用就是將這些鏈接緩存下來,下次能夠直接用已經創建好的鏈接,提高服務器性能。sql

二、管理服務和工具組件 系統管理和控制工具,例如備份恢復、Mysql複製、集羣等 。數據庫

三、SQL接口 接受用戶的SQL命令,而且返回用戶須要查詢的結果。設計模式

四、查詢解析器 SQL命令傳遞到解析器的時候會被解析器驗證和解析(權限、語法結構)。解析器是由Lex和YACC實現的,是一個很長的腳本, 主要功能:數組

  • 將SQL語句分解成數據結構,並將這個結構傳遞到後續步驟,之後SQL語句的傳遞和處理就是基於這個結構的
  • 若是在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的

五、查詢優化器 SQL語句在查詢以前會使用查詢優化器對查詢進行優化 他使用的是「選取-投影-聯接」策略進行查詢。緩存

用一個例子就能夠理解: select uid,name from user where gender = 1;服務器

  • 這個select 查詢先根據where 語句進行選取,而不是先將表所有查詢出來之後再進行age過濾
  • 這個select查詢先根據id和name進行屬性投影,而不是將屬性所有取出之後再進行過濾
  • 將這兩個查詢條件聯接起來生成最終查詢結果

六、緩存 若是查詢緩存有命中的查詢結果,查詢語句就能夠直接去查詢緩存中取數據數據結構

七、插入式存儲引擎 存儲引擎說白了就是如何管理操做數據(存儲數據、如何更新、查詢數據等)的一種方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)架構

2、MySQL存儲引擎

對於MySQL 5.5及更高版本,默認的存儲引擎是InnoDB。在5.5版本以前,MySQL的默認存儲引擎是MyISAM。mvc

一、什麼是MySQL存儲引擎?

MySQL屬於關係型數據庫,而關係型數據庫的存儲是以表的形式進行的,對於表的建立,數據的存儲,檢索,更新等都是由MySQL存儲引擎完成的,這也是MySQL存儲引擎在MySQL中扮演的重要角色。存儲引擎能夠歸納爲數據文件在磁盤上的不一樣組織形式. SQL Server和Oracle的讀者可能很清楚,這兩種數據庫的存儲引擎只有一個,而MySQL的存儲引擎種類比較多,如MyISAM,InnoDB和Memory.多種存儲引擎是由於MySQL的開源性.

二、MySQL存儲引擎的做用是什麼?

MySQL存儲引擎在MySQL中扮演重要角色,其做比較重要做用,大體歸結爲以下兩方面:

  • 管理表建立,數據檢索,索引建立等
  • 知足自定義存儲引擎開發。

三、MySQL存儲引擎種類

經常使用的三種存儲引擎:

(1)InnoDB

MySQL 5.5 及之後版本中的默認存儲引擎,他的優勢以下:

  • 災難恢復性好
  • 支持事務
  • 使用行級鎖
  • 支持外鍵關聯
  • 支持熱備份
  • 對於InnoDB引擎中的表,其數據的物理組織形式是簇表(Cluster Table),主鍵索引和數據是在一塊兒的,數據按主鍵的順序物理分佈實現了緩衝管理,不只能緩衝索引也能緩衝數據,而且會自動建立散列索引以加快數據的獲取

(2)MyISAM

該存儲引擎管理非事務性表;使用表級鎖;提供高速存儲和檢索;能夠配合鎖,實現操做系統下的複製備份、遷移;支持全文搜索;數據緊湊存儲,所以可得到更小的索引和更快的全表掃描性能。

(3)MEMORY

提供內存中的表,之前稱爲堆,不支持事務和外鍵。它在RAM中處理全部數據,以便比在磁盤上存儲數據更快地訪問。用於快速查找引用和其餘相同的數據。

不經常使用的幾種存儲引擎:

(4)MERGE

將多個相似的MyISAM表分組爲一個表,能夠處理非事務性表,默認狀況下包括這些表。

(5)PERFORMANCE_SCHEMA

該引擎主要用於收集數據庫服務器性能參數。這種引擎提供如下功能:提供進程等待的詳細信息,包括鎖、互斥變量、文件信息;保存歷史的事件彙總信息,爲提供MySQL服務器性能作出詳細的判斷;對於新增和刪除監控事件點都很是容易,並能夠隨意改變mysql服務器的監控週期,例如(CYCLE、MICROSECOND)。 MySQL用戶是不能建立存儲引擎爲PERFORMANCE_SCHEMA的表。

(6)ARCHIVE

Archive是歸檔的意思,在歸檔以後不少的高級功能就再也不支持了,僅僅支持最基本的插入和查詢兩種功能。在MySQL 5.5版之前,Archive是不支持索引,可是在MySQL 5.5之後的版本中就開始支持索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,因此它常常被用來當作倉庫使用。

(7)CSV

該種類型的存儲引擎不支持索引,即便用該種類型的表沒有主鍵列;另外也不容許表中的字段爲null。csv的編碼轉換須要格外注意。

(8)BLACKHOLE

該存儲引擎支持事務,並且支持mvcc的行級鎖,寫入這種引擎表中的任何數據都會消失,主要用於作日誌記錄或同步歸檔的中繼存儲,這個存儲引擎除非有特別目的,不然不適合使用。

(9)FEDERATED

該存儲引擎能夠不一樣的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。這種存儲引擎很是適合數據庫分佈式應用。將數據存儲在遠程數據庫中,本地是不存儲任何數據的。

四、MySQL存儲引擎的選擇


3、數據庫的範式設計

一、關係數據庫有六種範式:

第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF)。知足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步知足更多要求的稱爲第二範式(2NF),其他範式以此類推。通常說來,數據庫只需知足第三範式(3NF)就好了。

(1) 第一範式

1NF是對屬性的原子性,要求屬性具備原子性,不可再分解;

第一範式是最基本的範式。若是數據庫表中的全部字段值都是不可分解的原子值,就說明該數據庫表知足了第一範式。數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。簡而言之,第一範式就是無重複的域。

(2)第二範式

2NF是對記錄的唯一性,要求記錄有唯一標識,即實體的唯一性,即不存在部分依賴;

知足第二範式必須先知足第一範式。第二範式須要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不能夠把多種數據保存在同一張數據庫表中。

(3)第三範式

3NF是對字段的冗餘性,要求任何字段不能由其餘字段派生出來,它要求字段沒有冗餘,即不存在傳遞依賴;

首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的狀況。簡而言之,第三範式(3NF)要求一個關係中不包含已在其它關係已包含的非主關鍵字信息。

二、 範式的利弊

優勢:範式能夠避免數據冗餘,減小數據庫的空間,減輕維護數據完整性的麻煩。

缺點:按照範式的規範設計出來的表,等級越高的範式設計出來的表越多。

例如第一範式可能設計出來的表可能只有一張表而已,再按照第二範式去設計這張表時就可能出來兩張或更多張表,若是再按第三範式或更高的範式去設計這張表會出現更多比第二範式多 的表。表的數量越多,當咱們去查詢一些數據,必然要去多表中去查詢數據,這樣查詢的時間要比在一張表中查詢中所用的時間要高不少。也就是說咱們所用的範式越高,對數據操做的性能越低。因此咱們在利用範式設計表的時候,要根據具體的需求再去權衡是否使用更高範式去設計表。

三、反範式

故名思義,跟範式所要求的正好相反,在反範式的設計模式,咱們能夠容許適當的數據的冗餘,用這個冗餘去取操做數據時間的縮短。也就是用空間來換取時間,把數據冗餘在多個表中,當查詢時能夠減小或者是避免表之間的關聯。

四、反範式的利弊

優勢:查詢時能夠減小表的關聯;能夠更好的進行索引優化;

缺點:存在數據冗餘以及數據維護異常;對數據的修改須要更多的成本

4、MySQL索引

一、數據庫索引的原理

該原理就是對收集到的大量數據進行篩選,從中搜索出本身須要得到的重要信息。如針對數據庫中的一行或是多行,篩選出知足你設定條件的人數等。創建數據庫索引的便利之處在於能迅速定位到信息,爲搜索提供幫助。

二、MySQL中索引的優勢和缺點

優勢:

  • 全部的MySql列類型(字段類型)均可以被索引,也就是能夠給任意字段設置索引
  • 大大加快數據的查詢速度

缺點:

  • 建立索引和維護索引要耗費時間,而且隨着數據量的增長所耗費的時間也會增長
  • 索引也須要佔空間,咱們知道數據表中的數據也會有最大上線設置的,若是咱們有大量的索引,索引文件可能會比數據文件更快達到上線值
  • 當對錶中的數據進行增長、刪除、修改時,索引也須要動態的維護,下降了數據的維護速度。

三、MySQL中索引的使用原則

經過上面說的優勢和缺點,咱們應該能夠知道,並非每一個字段度設置索引就好,也不是索引越多越好,而是須要本身合理的使用。

  • 對常常更新的表就避免對其進行過多的索引,對常常用於查詢的字段應該建立索引。
  • 數據量小的表最好不要使用索引,由於因爲數據較少,可能查詢所有數據花費的時間比遍歷索引的時間還要短,索引就可能不會產生優化效果。
  • 在一同值少的列上(字段上)不要創建索引,好比在學生表的"性別"字段上只有男,女兩個不一樣值。相反的,在一個字段上不一樣值較多能夠創建索引。

上面說的只是很片面的一些東西,索引確定還有不少別的優勢或者缺點,還有使用原則,先基本上理解索引,而後等之後真正用到了,就會慢慢知作別的做用。

四、MySQL數據庫的索引類型

索引咱們分爲四類來說 單列索引(普通索引,惟一索引,主鍵索引)、組合索引、全文索引、空間索引

單列索引:一個索引只包含單個列,但一個表中能夠有多個單列索引。

(1)普通索引

MySQL中基本索引類型,沒有什麼限制,容許在定義索引的列中插入重複值和空值,用於加速查詢。

建立方法:

a. 建表的時候一塊兒建立

CREATE TABLE mytable ( name VARCHAR(32) , INDEX index_mytable_name (name) );

b. 建表後,直接建立索引

CREATE INDEX index_mytable_name ON mytable(name);

c. 修改表結構

ALTER TABLE mytable ADD INDEX index_mytable_name (name);
注:若是是字符串字段,還能夠指定索引的長度,在列命令後面加上索引長度就能夠了(例如:name(11))

(2)惟一索引

索引列中的值必須是惟一的,可是容許爲空值。若是是組合索引,則列值的組合必須惟一。

建立方法:

a.建表的時候一塊兒建立

CREATE TABLE mytable ( `name` VARCHAR(32) , UNIQUE index_unique_mytable_name (`name`) );

b. 建表後,直接建立索引

CREATE UNIQUE INDEX index_mytable_name ON mytable(name);

c. 修改表結構

ALTER TABLE mytable ADD UNIQUE INDEX index_mytable_name (name);
注:若是是字符串字段,還能夠指定索引的長度,在列命令後面加上索引長度就能夠了(例如:name(11))

(3)主鍵索引

是一種特殊的惟一索引,一個表只能有一個主鍵,不容許有空值。通常是在建表的時候同時建立主鍵索引。

建立方法:

a.建表的時候一塊兒建立

CREATE TABLE mytable ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` VARCHAR(32) , PRIMARY KEY (`id`) );

b. 修改表結構

ALTER TABLE test.t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id);
注:若是是字符串字段,還能夠指定索引的長度,在列命令後面加上索引長度就能夠了(例如:name(11))

(4)組合索引

在表中的多個字段組合上建立的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合。

建立方法:

a.建表的時候一塊兒建立

CREATE TABLE mytable ( `id` int(11) , `name` VARCHAR(32) , INDEX index_mytable_id_name (`id`,`name`) );

b. 建表後,直接建立索引

CREATE INDEX index_mytable_id_name ON mytable(id,name);

c. 修改表結構

ALTER TABLE mytable ADD INDEX index_mytable_id_name (id,name);

(5)全文索引

全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引,介紹了要求,說說什麼是全文索引,就是在一堆文字中,經過其中的某個關鍵字等,就能找到該字段所屬的記錄行,好比有"你是個靚仔,靚女 ..." 經過靚仔,可能就能夠找到該條記錄。這裏說的是可能,由於全文索引的使用涉及了不少細節,咱們只須要知道這個大概意思。

建立方法:

a. 建表的時候一塊兒建立

CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(250) NOT NULL , `contents` text NULL , `create_at` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (contents) );

b. 建表後,直接建立索引

CREATE FULLTEXT INDEX index_article_contents ON article(contents);

c. 修改表結構

ALTER TABLE article ADD FULLTEXT INDEX index_article_contents (contents);

(6)空間索引

空間索引是對空間數據類型的字段創建的索引,MySQL中的空間數據類型有四種,GEOMETRY、POINT、LINESTRING、POLYGON。在建立空間索引時,使用SPATIAL關鍵字。要求,引擎爲MyISAM,建立空間索引的列,必須將其聲明爲NOT NULL。

若是任何問題或者建議,歡迎留言交流。

更多學習內容請訪問從碼農成爲架構師的修煉之路

相關文章
相關標籤/搜索