日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL数据库:存储引擎

發布時間:2024/9/30 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL数据库:存储引擎 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是存儲引擎:

???????存儲引擎是MylSQL的核心,是數據庫底層軟件組織,數據庫使用存儲引擎進行創建、查詢、更新和刪除數據。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖級別、事務等功能。存儲引擎是基于表的,而非數據庫。

?

二、常用的存儲引擎:

1、InnoDB存儲引擎:

InnoDB是MySQL5.5版本之后的默認存儲引擎,它是為了達到處理巨大數據量的最大性能而設計的,其CPU效率可能是任何其他基于磁盤的關系型數據庫引擎鎖不能匹敵的。

InnoDB支持事務、提供行級鎖,每個表的主鍵不能為空且支持主鍵自增長,支持外鍵完整性約束;

2、MyISAM存儲引擎:

不支持事務、也不支持外鍵,使用表級鎖控制并發的讀寫操作,支持全文索引。MyISAM引擎強調快速讀取操作,主要用于高負載的select,對事務完整性沒有要求的應用可以用這個引擎來創建表。

MyISAM類型的表支持三種不同的存儲結構:靜態型、動態型、壓縮型:

(1)靜態型:指定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的數據類型)。使用靜態格式的表的性能比較高,因為在維護和訪問以預定格式存儲的數據時,需要的開銷比較低,但這種高性能是以空間為代價換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,占據了整個空間。優點存儲非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多。

(2)動態型:如果列定義為動態的(xblob, xtext, varchar等數據類型),這時MyISAM就自動使用動態型,雖然動態型的表占用了比靜態型表較少的空間,但帶來了性能的降低,因為如果某個字段的內容發生改變,則其位置很可能需要移動,這樣就會導致碎片的產生,隨著數據變化的增多,碎片也隨之增加,數據訪問性能會隨之降低。

對于因碎片增加而降低數據訪問性這個問題,有兩種解決辦法:

① 盡可能使用靜態數據類型;

② 經常使用optimize table table_name語句整理表的碎片,恢復由于表數據的更新和刪除導致的空間丟失。如果存儲引擎不支持 optimize table table_name則可以轉儲并重新加載數據,這樣也可以減少碎片;

(3)壓縮型:如果在數據庫中創建在整個生命周期內只讀的表,則應該使用MyISAM的壓縮型表來減少空間的占用,因為每個記錄是被單獨壓縮的,所以只有非常小的訪問開支。

3、Memory存儲引擎:

Memory存儲引擎通過在內存中創建臨時表來存儲數據。每個表實際對應一個磁盤文件,該文件的文件名和表名是相同的,類型為.frm。該磁盤文件只存儲表的結構,而數據存儲在內存中,所以使用該種引擎的表擁有極高的插入、更新和查詢效率。由于所存儲的數據保存在內存中,如果mysqld進程發生異常、重啟或計算機關機等等都會造成這些數據的消失。

默認使用Hash 索引,也可以使用B樹型索引。

Memory存儲引擎主要用于內容變化不頻繁,或者作為統計操作的中間結果表,便于高效地對中間結果進行分析并得到最終的統計結果。

4、Archive存儲引擎:

Archive引擎提供了很好的壓縮機制,它使用zlib壓縮庫,壓縮比非常高,并且擁有高效的插入速度,支持insert、replace和select操作,但不支持update、delete,不支持事務,也不支持索引(5.5版本之后支持索引),所以查詢性能較差一些,所以該適合用于做倉庫使用和數據歸檔,存儲大量獨立的、作為歷史記錄的數據,如記錄日志信息,因為他們不經常被讀取。

5、Merge存儲引擎:

Merge存儲引擎是將一定數量的MyISAM表結構完全相同的表聯合成一個整體,Merge表本身并沒有數據,對Merge類型的表可以進行查詢,更新,刪除操作,這些操作實際上是對內部的MyISAM表進行的。

6、Berkeley存儲引擎:(BDB)

該存儲引擎支持COMMIT和ROLLBACK等其他事務特性,支持頁級鎖。該引擎在包括MySQL 5.1及其以上版本的數據庫中不再支持。? ?

7、CSV(Comma-Separated Values逗號分隔值)

邏輯上由逗號分割數據的存儲引擎。使用該引擎的MySQL數據庫表會在MySQL安裝目錄data文件夾中的和該表所在數據庫名相同的目錄中生成一個.CSV文件(所以,它可以將CSV類型的文件當做表進行處理),這種文件是一種普通文本文件,每個數據行占用一個文本行。該種類型的存儲引擎不支持索引,即使用該種類型的表沒有主鍵列;另外也不允許表中的字段為null。

8、Federated:

該存儲引擎可以將不同的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合數據庫分布式應用。

9、Cluster/NDB:

高冗余的存儲引擎,該存儲引擎用于多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大、安全和性能要求高的場景。?

10、BLACKHOLE(黑洞引擎)

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

11、PERFORMANCE_SCHEMA:

該引擎主要用于收集數據庫服務器性能參數。這種引擎提供以下功能:提供進程等待的詳細信息,包括鎖、互斥變量、文件信息;保存歷史的事件匯總信息,為提供MySQL服務器性能做出詳細的判斷;對于新增和刪除監控事件點都非常容易,并可以隨意改變mysql服務器的監控周期,例如(CYCLE、MICROSECOND)。

?

三、MyISAM 與 InnoDB 存儲引擎的區別:

1、事務支持:MyISAM不支持事務處理,InnoDB支持事務處理。

2、鎖級別:MyISAM只支持表級鎖,InnoDB支持行級鎖和表級鎖,默認使用行級鎖,但是InnoDB的行鎖是通過給索引項加鎖來實現的,即只有通過索引進行查詢數據,InnoDB才使用行級鎖,否則將使用表鎖。行級鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖更多的資源。使用行鎖可能會存在死鎖的情況,但是表級鎖不存在死鎖。

3、表主鍵與外鍵約束:

(1)MyISAM:允許沒有任何索引和主鍵的表存在。不支持外鍵。

(2)InnoDB:支持主鍵自增長列且主鍵不能為空,如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6字節的主鍵(用戶不可見)。支持外鍵完整性約束。

4、索引結構:MyISAM和InnoDB都是使用B+樹索引,MyISAM的主鍵索引和輔助索引的Data域都是保存行的地址,但是InnoDB的主鍵索引保存的不是行的地址,而是保存該行的所有所有數據,而輔助索引的Data域保存的則是主索引的值。

5、全文索引:MyISAM支持FULLTEXT類型的全文索引,InnoDB不支持全文索引(5.6版本之后InnoDB存儲引擎開始支持全文索引

6、存儲結構:

(1)MyISAM會在磁盤上存儲成三個文件。

  • .frm:存儲表定義
  • .MYD:存儲數據
  • .MYI:存儲索引?

(2)InnoDB:把數據和索引存放在表空間里面,所有的表都保存在同一個數據文件中,InnoDB表的大小只受限于操作系統文件的大小,一般為2GB。

7、存儲空間:

(1)MyISAM:可被壓縮,存儲空間較小。支持三種不同的存儲格式:靜態表(默認,但是注意數據末尾不能有空格,會被去掉)、動態表、壓縮表。

(2)InnoDB:需要更多的內存和存儲,它會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。

8、表的具體行數:

(1)MyISAM:保存有表的總行數,如果select count() from table;會直接取出出該值,不需要進行全表掃描。

(2)InnoDB:沒有保存表的總行數,如果使用select count() from table;需要會遍歷整個表,消耗相當大。

9、適用場景:

(1)如果需要提供回滾、崩潰恢復能力的ACID事務能力,并要求實現行鎖級別并發控制,InnoDB是一個好的選擇;

(2)如果數據表主要用來查詢記錄,讀操作遠遠多于寫操作且不需要數據庫事務的支持,則MyISAM引擎能提供較高的處理效率;

?

四、存儲引擎的操作:

1、查看Mysql的存儲引擎信息:

mysql > show engines;

查詢結果:

Support列的值表示某種引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示該引擎為當前默認的存儲引擎 。

2、查看數據庫默認使用哪個引擎,使用命令:

show variables like 'storage_engine';

查詢結果為:

?

3、設置默認的存儲引擎:

(1)在MySQL的配置文件中(linux下為/etc/my.cnf),在mysqld后面增加default-storage-engine=INNODB即可。

或者在啟動數據庫服務器時在命令行后面加上–default-storage-engine或–default-table-type選項 。

(2)在創建表時指定存儲引擎的類型:

CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB;

(3)修改現有的表使用的存儲引擎:

ALTER TABLE mytable ENGINE = MyISAM;

缺點:

這種轉化方式需要大量的時間?和I/O,mysql要執行從舊表到新表的一行一行的復制,所以效率比較低;

②在轉化這期間源表加了讀鎖;

③從一種引擎到另一種引擎做表轉化,所有屬于原始引擎的專用特性都會丟失,比如從innodb到?myisam?則?innodb的索引會丟失!

(4)導出再導入:如果表建立的時候是MyISAM,現在要更改整個數據庫表的存儲引擎,一般要一個表一個表的修改,比較繁瑣,可以采用先把數據庫導出,得到SQL,把MyISAM修改成INNODB,再導入的方式。

?

相關博客:https://blog.csdn.net/gaohuanjie/article/details/50944782

總結

以上是生活随笔為你收集整理的MySQL数据库:存储引擎的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。