(轉)Mysql數據庫存儲引擎

 

什麼是MySql數據庫mysql

    一般意義上,數據庫也就是數據的集合,具體到計算機上數據庫能夠是存儲器上一些文件的集合或者一些內存數據的集合。
    咱們一般說的MySql數據庫,sql server數據庫等等實際上是數據庫管理系統,它們能夠存儲數據,並提供查詢和更新數據庫中的數據的功能等等。根據數據庫如何存儲數據和如何操做數據的實現機制不一樣,這些數據庫之間即有區別又有共同點。
    MySql數據庫是開放源代碼的關係型數據庫。目前,它能夠提供的功能有:支持sql語言、子查詢、存儲過程、觸發器、視圖、索引、事務、鎖、外鍵約束和影像複製等。在後期,咱們會詳細講解這些功能。
    同Oracle 和SQL Server等大型數據庫系統同樣,MySql也是客戶/服務器系統而且是單進程多線程架構的數據庫。
    MySql區別於其它數據庫系統的一個重要特色是支持插入式存儲引擎。

那麼什麼是存儲引擎呢?(重要)sql

    存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)。
    在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的。 而MySql數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據本身的須要編寫本身的存儲引擎。
MySql中有哪些存儲引擎?
 
    1MyISAM:這種引擎是mysql最先提供的。這種引擎又能夠分爲靜態MyISAM、動態MyISAM 和壓縮MyISAM三種:
    靜態MyISAM:若是數據表中的各數據列的長度都是預先固定好的,服務器將自動選擇這種表類型。由於數據表中每一條記錄所佔用的空間都是同樣的,因此這種表存取和更新的效率很是高。當數據受損時,恢復工做也比較容易作。
    動態MyISAM:若是數據表中出現varchar、xxxtext或xxxBLOB字段時,服務器將自動選擇這種表類型。相對於靜態MyISAM,這種表存儲空間比較小,但因爲每條記錄的長度不一,因此屢次修改數據後,數據表中的數據就可能離散的存儲在內存中,進而致使執行效率降低。同時,內存中也可能會出現不少碎片。所以,這種類型的表要常常用optimize table 命令或優化工具來進行碎片整理。
    壓縮MyISAM:以上說到的兩種類型的表均可以用myisamchk工具壓縮。這種類型的表進一步減少了佔用的存儲,可是這種表壓縮以後不能再被修改。另外,由於是壓縮數據,因此這種表在讀取的時候要先時行解壓縮。
    可是,無論是何種MyISAM表,目前它都不支持事務,行級鎖和外鍵約束的功能。
    2 MyISAM Merge引擎:這種類型是MyISAM類型的一種變種。合併表是將幾個相同的MyISAM表合併爲一個虛表。常應用於日誌和數據倉庫。
   3 InnoDB: InnoDB表類型能夠看做是對MyISAM的進一步更新產品,它提供了事務、行級鎖機制和外鍵約束的功能。
   4 memory(heap): 這種類型的數據表只存在於內存中。它使用散列索引,因此數據的存取速度很是快。 由於是存在於內存中,因此這種類型常應用於臨時表中。
   5 archive: 這種類型只支持select 和 insert語句,並且不支持索引。常應用於日誌記錄和聚合分析方面。
   固然MySql支持的表類型不止上面幾種。

   下面咱們介紹一下如何查看和設置數據表類型。 數據庫

MySql中關於存儲引擎的操做緩存

   1 查看數據庫能夠支持的存儲引擎
   用show engines; 命令能夠顯示當前數據庫支持的存儲引擎狀況,如圖1所示:安全

                                            圖1 數據庫的存儲引擎bash


   由上圖可見當前系統的默認數據表類型是MyISAM。固然,咱們能夠經過修改數據庫配置文件中的選項,設定默認表類型。
   2 查看錶的結構等信息的若干命令
   要查看錶的定義結構等信息可使用如下幾種命令:
   2.1Desc[ribe] tablename; //查看數據表的結構
   例如,查看錶t1的結構,可得下圖。服務器

                                        圖2:查看錶t1的結構
 
   2.2 Show create table tablename; //顯示錶的建立語句
   同上查詢表t1,得下圖:數據結構

                                          圖3 顯示建立表t1的語句多線程

 
   2.3 show table status like ‘tablename’\G顯示錶的當前狀態值架構

    同上查詢表t1,得下圖:

                   圖4 顯示錶t1 的當前狀態值

 
   綜上可見,後兩種方式均可以幫助咱們查看某一表的存儲引擎類型(圖中已用紅色方框標出)。
   3  設置或修改表的存儲引擎
   3.1建立數據庫表時設置存儲存儲引擎的基本語法是:
Create table tableName(
columnName(列名1)  type(數據類型)  attri(屬性設置),
columnName(列名2)  type(數據類型)  attri(屬性設置),
……..) engine = engineName

例如,假設要建立一個名爲user的表,此表包括id,用戶名username和性別sex三個字段,而且要設置表類型爲merge。則可用以下的方式建立此數據表,

create table user(

  id int not null auto_increment,

  username char(20) not null,

  sex char(2),

  primary key(id)

) engine=merge

具體執行結果見下圖:

            圖5 建立表user 

                                                                                                                                                                                                                                       

查看建立後表user的信息,可見表的當前存儲引擎是merge,如圖所示:

             圖6 顯示錶t1 的當前狀態值

 

   3.2修改存儲引擎,能夠用命令Alter table tableName engine =engineName

假如,若須要將表user的存儲引擎修改成archive類型,則可以使用命令alter table user engine=archive。以下圖所示:

             圖7 修改表user的存儲引擎

 
查看修改後的表類型,可見表類型已經變爲archive類型。

             圖8 顯示錶user修改後的狀態值
 
小結
     在本文中主要介紹了什麼是MySql數據庫,並進一步引出了它的一個重要特性, 即插入式的多存儲引擎機制。而後,簡單介紹了什麼是存儲引擎和MySql中幾種主要的存儲引擎。最後,介紹瞭如何查看數據庫支持的全部存儲引擎,如何查看數據庫表的存儲引擎類型及如何設置或修改表的存儲引擎類型。剛剛入門學習MySql,文中有錯誤之處,還請你們多多指導!

 

 

補充資料:


簡單介紹

存儲引擎就是指表的類型。數據庫的存儲引擎決定了表在計算機中的存儲方式。存儲引擎的概念是MySQl的特色,並且是一個插入式的存儲引擎概念。這就決定了MySQl數據庫中的表可使用不一樣的存儲方式存儲。用戶能夠根據本身的不一樣要求,選擇不一樣的存儲方式、是否進行事務處理等。


查詢方式及內容解析

使用SHOW ENGINES語句能夠查看MySQL數據庫支持的存儲引擎類型。查詢方法以下:

1
SHOW ENGINES;

SHOW ENGUNES語句可使用「;」結束,也可使用「\g」或者「\G」結束。「\g」與「;」的做用相同,「\G」可讓結果顯示的更加美觀。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mysql> SHOW ENGINES\G
*************************** 1. row ***************************
       Engine: MRG_MYISAM
      Support: YES
      Comment: Collection of identical MyISAM tables
Transactions: NO
           XA: NO
   Savepoints: NO
*************************** 2. row ***************************
       Engine: InnoDB
      Support: DEFAULT
      Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
           XA: YES
   Savepoints: YES
*************************** 3. row ***************************
       Engine: MyISAM
      Support: YES
      Comment: MyISAM storage engine
Transactions: NO
           XA: NO
   Savepoints: NO
###############中間已省略###################
*************************** 8. row ***************************
       Engine: MEMORY
      Support: YES
      Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
           XA: NO
   Savepoints: NO
8 rows in set (0.11 sec)

解析:查詢結果中,Engine參數指存儲引擎名稱;Support參數說明MySQL是否支持該類引擎,YES表示支持;Comment參數指對該引擎的評論;Transactions 參數表示是否支持事務處理,YES表示支持;XA參數表示是否分佈式交易處理XA規範,YES表示支持;Savepoints參數表示是否支持保存點,以便事務回滾到保存點,YES表示支持。

從查詢結果中能夠看出,MySQL支持的引擎參數包括MyISAM、MEMORY、InnoDB、ARCHIVE和MRG_MYISAM等。其中InnoDB爲默認的存儲引擎。可以使用語句查詢默認的存儲引擎此代碼以下:

 

1
SHOW VARIABLES LIKE 'storage_engine' ;

代碼執行的結果以下:

1
2
3
4
5
6
7
mysql> SHOW VARIABLES LIKE 'storage_engine' ;
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| storage_engine | InnoDB |
+----------------+--------+
1 row in set (0.10 sec)

解析:結果顯示默認的存儲引擎爲InnoDB。若是想修改默認的存儲引擎能夠在配置文件my.ini中修改。將」default-storage-engine=InnoDB」更改成」default-storage-engine=MyISAM」。而後重啓服務,修改生效。

使用SHOW TABLESTATUS能夠查看某個庫中全部表支持的存儲引擎類型查詢方法以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> USE hellodb
Database changed
mysql> SHOW TABLE STATUS\G
*************************** 7. row ***************************
            Name: toc
          Engine: MyISAM
         Version: 10
      Row_format: Fixed
            Rows: 0
  Avg_row_length: 0
     Data_length: 0
Max_data_length: 2533274790395903
    Index_length: 1024
       Data_free: 0
  Auto_increment: 1
     Create_time: 2013-08-12 16:17:23
     Update_time: 2013-08-12 16:17:23
      Check_time: NULL
       Collation: utf8_general_ci
        Checksum: NULL
  Create_options:
         Comment:

解析:結果顯示對於MySQL來講全部表默認都是使用MyISAM存儲引擎,其中Name:表名;Engine:使用的存儲引擎;Version:所用存儲引擎的版本;Row_format:行格式,對於MyISAM存儲引擎來講常見的有Dynamic(變長記錄), Fixed(定長記錄), Compressed(壓縮之後存放的行), compact(InnoDB中常見的);Rows: 表中的行數(對於其餘存儲引擎來講這個值是估算的);Avg_row_length: 行的平均字節數;Data_length:表的數據量,單位爲字節;Max_data_length:表的容量上限(不一樣的存儲引擎容量上限不一樣);Index_length:索引數據量,單位字節;Data_free:已經分配出去,但未存儲數據的存儲空間;Auto_increment:具備自動增加屬性的字段上,下一個自動增加的值;Create_time:表的建立時間;Update_time: 數據最近一次的更新時間;Check_time: 使用CHECK命令最近一次檢查表的時間;myisamchk; Checksum: 表的校驗和;Create_options:建立表時指定的其它選項;Comment: 對於MyISAM表,存儲的是建立表時的comment表選項指定的信息;對InnoDB表來說,存儲對應的表空間剩餘的表空間信息。


各類存儲引擎特性比較:

在實際工做中,選擇一個合適的存儲引擎是一個很複雜的問題。每種存儲引擎都有各自的優點,不能籠統的說誰比誰更好。下面將詳解不一樣環境常常用到的存儲引擎和針對各個存儲引擎的特色進行對比,給出不一樣的選擇建議。

  • InnoDB存儲引擎

InnoDB是Mysql數據庫的一種存儲引擎。InnoDB給Mysql的表提供了 事務、回滾、崩潰修復能力、多版本併發控制的事務安全、間隙鎖(能夠有效的防止幻讀的出現)、支持輔助索引、聚簇索引、自適應hash索引、支持熱備、行級鎖。還有InnoDB是Mysql上惟一一個提供了外鍵約束的引擎。

InnoDB存儲引擎中,建立的表的表結構是單獨存儲的而且存儲在.frm文件中。數據和索引存儲在一塊兒的而且存儲在表空間中。可是默認狀況下mysql會將數據庫的全部InnoDB表存儲在一個表空間中的。其實這種方式管理起來很是的不方便並且還不支持高級功能因此建議每一個表存儲爲一個表空間實現方式爲:使用服務器變量innodb_file_per_table = 1。

若是須要頻繁的進行更新、刪除操做的數據庫也可選擇InnoDB存儲引擎。由於該存儲引擎能夠實現事務提交和回滾。

  • MyISAM存儲引擎

MyISAM存儲引擎是Mysql中常見的存儲引擎,MyISAM存儲引擎是基於ISAM存儲引擎發展起來的。MyISAM支持全文索引、壓縮存放、空間索引(空間函數)、表級鎖、延遲更新索引鍵。可是MyISAM不支持事務、行級鎖、更沒法忍受的是崩潰後不能保證徹底恢復(只能手動修復)。

MyISAM存儲引擎的表存儲成3個文件。文件的名字和表的名字相同。擴展名包含frm、MYD、MYI。其中frm爲擴展名的文件存儲表的結構;MYD爲擴展名的文件存儲數據,其是MYData的縮寫;MYI爲擴展名的文件存儲索引,其爲MYIndex的縮寫。

MyISAM存儲引擎的插入數據很快,空間和內存使用比較低。若是表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM存儲引擎可以實現處理的高效率。若是應用的完整性、併發性要求很低,也能夠選擇MyISAM存儲引擎。

  • ARCHIVE

ARCHIVE,見名之意可看出是歸檔,因此歸檔以後不少的高級功能就再也不支持了僅支持插入(insert)和查詢(select)兩種功能, ARCHIVE存儲引擎以前還不支持索引(在Mysql5.5之後開始支持索引了),可是它擁有很好的壓縮機制。一般用於作倉庫使用。

ARCHIVE存儲引擎適用於存儲日誌信息或其餘按時間序列實現的數據採集類的應用場景中。

  • CSV

CSV是將數據文件保存爲CSV格式的的文件的,能夠方便的導入到其餘數據庫中去(例如:excel表格,SQLserver等等),由此須要在數據庫間自由共享數據時才偶爾建議使用此存儲引擎。而且它也不支持索引;我的認爲僅適用於數據交換。

  • BLACKHOME

BLACKHOME叫作黑洞,也就是說沒有存儲機制,任何數據都會被丟棄,可是會記錄二進制日誌。通常在Mysql複製(中繼服務器)中常常用到,這個在Mysql複製博客中將詳細介紹,敬請關注。

  • FEDERATED

FEDERATED能夠實現跨服務器整理表,簡單說就是它能夠訪問遠程服務器上數據的存儲引擎,因此說它再也不本地建立數據只會自動的創建一個鏈接到其餘服務器上連接,有點相似於代理的功能,默認都是禁用的。

  • MEMORY存儲引擎

MEMORY存儲引擎是Mysql中的一類特殊的存儲引擎。其使用存儲在內存中的內存來建立表,並且全部數據保存在內存中。數據安全性很低,可是查找和插入速度很快。若是內存出現異常就會影響到數據的完整性,若是重啓或關機,表中的全部數據就會丟失,所以基於MEMORY存儲引擎的表的生命週期很短,通常都是一次性的。適用於某些特殊場景像查找和映射,緩存週期性的聚合數據等等。

  • MRG_MYISAM

MRG_MYISAM存儲引擎是合併MyISAM表的,就是將多個MyISAM合併爲一個(在用戶看來是一個進行工做,實際上是多個底層物理文件在運行工做)。

  • 擴展一些第三方存儲引擎

(1)、OLTP類:

XtraDB:InnoDB的改進版

PBXT:支持複製,外鍵約束,並且支持在固態存儲(SSD硬盤)上快速存取數據,是一個不錯的支持事務的存儲引擎,可是此存在的bug已再也不修復,被棄用。

TokuDB:圖庫數據庫,在存儲海量數據的方面有着mysql沒法比擬的優點,也有mysql版的,其最大優點支持分形樹索引結構,這個結構致使它和緩存無關也就直接致使了就算索引在數據庫文件中放不下也不會影響性能。通常只適用於大量插入數據的分析型場景。(註釋:這裏的圖不是照片等,而是複雜數據鏈接的數據結構。)

(2)、列式存儲引擎

列式數據庫:此種數據庫最適合存儲大數據,在數據檢索上也很好可是在必定程度上須要反關係存儲,所以可能沒法知足咱們關係型數據庫範式的概念因此被稱爲Nosql。

下面介紹幾個列式存儲引擎(都有兩個版本:社區版、商業版):

Infobright:適合於數十TB的大環境中、支持數據壓縮,默認狀況下mysql不支持列式存儲功能須要定製。使用者衆多,名氣很高。

MonetDB:首先,它的存儲模型是對數據從垂直方向進行切分;其次,MonetDB是第一個利用CPU緩存對數據的查詢進行優化的數據庫系統;此外,MonetDB會自動管理和協調索引機制,優化查詢效率。目前使用者不是不少。

InfiniDB:InfiniDB Community Edition (社區版)提供一個可伸縮的分析型數據庫引擎,主要爲數據倉庫、商業智能、以及對實時性要求不嚴格的應用而開發。基於 MySQL 搭建。包括對查詢、事務處理以及大數據量加載的支持。目前使用者不是不少。

LucidDB:是惟一一款專一於數據倉庫和商務智能的開源RDBMS,它使用了列存儲架構,支持位圖索引,哈希鏈接/聚合和頁面級多版本,大部分數據庫最初都注重事務處理能力,而分析功能都是後來才加上去的。相反,LucidDB中的全部組件從一開始就是爲知足靈活的需求,高性能數據集成和大規模數據查詢而設計的,此外,其架構設計完全從用戶出發,操做簡單。目前使用者不是不少。

(3)、社區存儲引擎(瞭解):

Aria:Maria的下一代版本。

Groona:能夠精確的實現全文索引引擎,能夠替代MyISAM在索引上的特性。

QQGraph:支持圖操做,由Open query研發

Sphinx:外在的服務器可以在Mysql基礎上爲Mysql構建一個高效的全文索引,經過C++研發,Mysql支持一個社區引擎叫SphinxSE,就是讓Sphinx直接支持Mysql接口,在MariaDB5.5.32上被編譯支持了。

Spider:支持分片,每個獨立的分片能夠實現獨立的查詢。

VPForMySQL:支持垂直分區,支持更大級別的數據操做更大級別的數據存儲。


選擇標準:

 一、是否須要支持事務??

 二、是否須要使用熱備??(冷熱備份

 三、崩潰恢復:可否接受崩潰??


我的建議:

 存儲日誌或按時間增加的數據:MyISAM、ARCHIVE

 論壇應用:InnoDB

 電商訂單:InnoDB

 數據量大:Infobright、NoSQL、Sphinx


我的總結,但願對博友們有用!!j_0019.gif

相關文章
相關標籤/搜索