存儲引擎是什么?
10年積累的成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有融安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲在文件(或者內(nèi)存)中 這些技術(shù)中的每一種技術(shù)都使用不同的存儲機(jī)制 索引技巧 鎖定水平并且最終提供廣泛的不同的功能和能力 通過選擇不同的技術(shù) 你能夠獲得額外的速度或者功能 從而改善你的應(yīng)用的整體功能
例如 如果你在研究大量的臨時數(shù)據(jù) 你也許需要使用內(nèi)存存儲引擎 內(nèi)存存儲引擎能夠在內(nèi)存中存儲所有的表格數(shù)據(jù) 又或者 你也許需要一個支持事務(wù)處理的數(shù)據(jù)庫(以確保事務(wù)處理不成功時數(shù)據(jù)的回退能力)
這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱作存儲引擎(也稱作表類型) MySQL默認(rèn)配置了許多不同的存儲引擎 可以預(yù)先設(shè)置或者在MySQL服務(wù)器中啟用 你可以選擇適用于服務(wù)器 數(shù)據(jù)庫和表格的存儲引擎 以便在選擇如何存儲你的信息 如何檢索這些信息以及你需要你的數(shù)據(jù)結(jié)合什么性能和功能的時候?yàn)槟闾峁┳畲蟮撵`活性
選擇如何存儲和檢索你的數(shù)據(jù)的這種靈活性是MySQL為什么如此受歡迎的主要原因 其它數(shù)據(jù)庫系統(tǒng)(包括大多數(shù)商業(yè)選擇)僅支持一種類型的數(shù)據(jù)存儲 遺憾的是 其它類型的數(shù)據(jù)庫解決方案采取的 一個尺碼滿足一切需求 的方式意味著你要么就犧牲一些性能 要么你就用幾個小時甚至幾天的時間詳細(xì)調(diào)整你的數(shù)據(jù)庫 使用MySQL 我們僅需要修改我們使用的存儲引擎就可以了
在這篇文章中 我們不準(zhǔn)備集中討論不同的存儲引擎的技術(shù)方面的問題(盡管我們不可避免地要研究這些因素的某些方面) 相反 我們將集中介紹這些不同的引擎分別最適應(yīng)哪種需求和如何啟用不同的存儲引擎 為了實(shí)現(xiàn)這個目的 在介紹每一個存儲引擎的具體情況之前 我們必須要了解一些基本的問題
如何確定有哪些存儲引擎可用
你可以在MySQL(假設(shè)是MySQL服務(wù)器 以上版本)中使用顯示引擎的命令得到一個可用引擎的列表
mysql?show?engines; ?? + + + + ?? |?Engine?????|?Support?|?Comment????????????????????????????????????????????????????| ?? + + + + ?? |?MyISAM?????|?DEFAULT?|?Default?engine?as?of?MySQL? ?with?great?performance?????| ?? |?HEAP???????|?YES?????|?Alias?for?MEMORY???????????????????????????????????????????| ?? |?MEMORY?????|?YES?????|?Hash?based ?stored?in?memory ?useful?for?temporary?tables??| ?? |?MERGE??????|?YES?????|?Collection?of?identical?MyISAM?tables??????????????????????| ?? |?MRG_MYISAM?|?YES?????|?Alias?for?MERGE????????????????????????????????????????????| ?? |?ISAM???????|?NO??????|?Obsolete?storage?engine ?now?replaced?by?MyISAM????????????| ?? |?MRG_ISAM???|?NO??????|?Obsolete?storage?engine ?now?replaced?by?MERGE?????????????| ?? |?InnoDB?????|?YES?????|?Supports?transactions ?row level?locking ?and?foreign?keys?| ?? |?INNOBASE???|?YES?????|?Alias?for?INNODB???????????????????????????????????????????| ?? |?BDB????????|?NO??????|?Supports?transactions?and?page level?locking???????????????| ?? |?BERKELEYDB?|?NO??????|?Alias?for?BDB??????????????????????????????????????????????| ?? |?NDBCLUSTER?|?NO??????|?Clustered ?fault tolerant ?memory based?tables?????????????| ?? |?NDB????????|?NO??????|?Alias?for?NDBCLUSTER???????????????????????????????????????| ?? |?EXAMPLE????|?NO??????|?Example?storage?engine?????????????????????????????????????| ?? |?ARCHIVE????|?NO??????|?Archive?storage?engine?????????????????????????????????????| ?? |?CSV????????|?NO??????|?CSV?storage?engine?????????????????????????????????????????| ?? + + + + ?? ?rows?in?set?( ?sec)??
這個表格顯示了可用的數(shù)據(jù)庫引擎的全部名單以及在當(dāng)前的數(shù)據(jù)庫服務(wù)器中是否支持這些引擎
對于MySQL 以前版本 可以使用mysql show variables like have_% (顯示類似 have_% 的變量):
mysql?show?variables?like? have_% ;? ?? + + +? ?? |?Variable_name????|?Value????|? ?? + + +? ?? |?have_bdb?????????|?YES??????|? ?? |?have_crypt???????|?YES??????|? ?? |?have_innodb??????|?DISABLED?|? ?? |?have_isam????????|?YES??????|? ?? |?have_raid????????|?YES??????|? ?? |?have_symlink?????|?YES??????|? ?? |?have_openssl?????|?YES??????|? ?? |?have_query_cache?|?YES??????|? ?? + + +? ?? ?rows?in?set?( ?sec)? ??
你可以通過修改設(shè)置腳本中的選項(xiàng)來設(shè)置在MySQL安裝軟件中可用的引擎 如果你在使用一個預(yù)先包裝好的MySQL二進(jìn)制發(fā)布版軟件 那么 這個軟件就包含了常用的引擎 然而 需要指出的是 如果你要使用某些不常用的引擎 特別是CSV RCHIVE(存檔)和BLACKHOLE(黑洞)引擎 你就需要手工重新編譯MySQL源碼
使用一個指定的存儲引擎
你可以使用很多方法指定一個要使用的存儲引擎 最簡單的方法是 如果你喜歡一種能滿足你的大多數(shù)數(shù)據(jù)庫需求的存儲引擎 你可以在MySQL設(shè)置文件中設(shè)置一個默認(rèn)的引擎類型(使用storage_engine 選項(xiàng))或者在啟動數(shù)據(jù)庫服務(wù)器時在命令行后面加上 default storage engine或 default table type選項(xiàng)
更靈活的方式是在隨MySQL服務(wù)器發(fā)布同時提供的MySQL客戶端時指定使用的存儲引擎 最直接的方式是在創(chuàng)建表時指定存儲引擎的類型 向下面這樣:
CREATE TABLE mytable (id int title char( )) ENGINE = INNODB
你還可以改變現(xiàn)有的表使用的存儲引擎 用以下語句:
ALTER TABLE mytable ENGINE = MyISAM
然而 你在以這種方式修改表格類型的時候需要非常仔細(xì) 因?yàn)閷Σ恢С滞瑯拥乃饕?字段類型或者表大小的一個類型進(jìn)行修改可能使你丟失數(shù)據(jù) 如果你指定一個在你的當(dāng)前的數(shù)據(jù)庫中不存在的一個存儲引擎 那么就會創(chuàng)建一個MyISAM(默認(rèn)的)類型的表
各存儲引擎之間的區(qū)別
為了做出選擇哪一個存儲引擎的決定 我們首先需要考慮每一個存儲引擎提供了哪些不同的核心功能 這種功能使我們能夠把不同的存儲引擎區(qū)別開來 我們一般把這些核心功能分為四類:支持的字段和數(shù)據(jù)類型 鎖定類型 索引和處理 一些引擎具有能過促使你做出決定的獨(dú)特的功能 我們一會兒再仔細(xì)研究這些具體問題
字段和數(shù)據(jù)類型
雖然所有這些引擎都支持通用的數(shù)據(jù)類型 例如整型 實(shí)型和字符型等 但是 并不是所有的引擎都支持其它的字段類型 特別是BLOG(二進(jìn)制大對象)或者TEXT文本類型 其它引擎也許僅支持有限的字符寬度和數(shù)據(jù)大小
這些局限性可能直接影響到你可以存儲的數(shù)據(jù) 同時也可能會對你實(shí)施的搜索的類型或者你對那些信息創(chuàng)建的索引產(chǎn)生間接的影響 這些區(qū)別能夠影響你的應(yīng)用程序的性能和功能 因?yàn)槟惚仨氁鶕?jù)你要存儲的數(shù)據(jù)類型選擇對需要的存儲引擎的功能做出決策
鎖定
數(shù)據(jù)庫引擎中的鎖定功能決定了如何管理信息的訪問和更新 當(dāng)數(shù)據(jù)庫中的一個對象為信息更新鎖定了 在更新完成之前 其它處理不能修改這個數(shù)據(jù)(在某些情況下還不允許讀這種數(shù)據(jù))
鎖定不僅影響許多不同的應(yīng)用程序如何更新數(shù)據(jù)庫中的信息 而且還影響對那個數(shù)據(jù)的查詢 這是因?yàn)椴樵兛赡芤L問正在被修改或者更新的數(shù)據(jù) 總的來說 這種延遲是很小的 大多數(shù)鎖定機(jī)制主要是為了防止多個處理更新同一個數(shù)據(jù) 由于向數(shù)據(jù)中插入信息和更新信息這兩種情況都需要鎖定 你可以想象 多個應(yīng)用程序使用同一個數(shù)據(jù)庫可能會有很大的影響
不同的存儲引擎在不同的對象級別支持鎖定 而且這些級別將影響可以同時訪問的信息 得到支持的級別有三種:表鎖定 塊鎖定和行鎖定 支持最多的是表鎖定 這種鎖定是在MyISAM中提供的 在數(shù)據(jù)更新時 它鎖定了整個表 這就防止了許多應(yīng)用程序同時更新一個具體的表 這對應(yīng)用很多的多用戶數(shù)據(jù)庫有很大的影響 因?yàn)樗舆t了更新的過程
頁級鎖定使用Berkeley DB引擎 并且根據(jù)上載的信息頁( KB)鎖定數(shù)據(jù) 當(dāng)在數(shù)據(jù)庫的很多地方進(jìn)行更新的時候 這種鎖定不會出現(xiàn)什么問題 但是 由于增加幾行信息就要鎖定數(shù)據(jù)結(jié)構(gòu)的最后 KB 當(dāng)需要增加大量的行 也別是大量的小型數(shù)據(jù) 就會帶來問題
行級鎖定提供了最佳的并行訪問功能 一個表中只有一行數(shù)據(jù)被鎖定 這就意味著很多應(yīng)用程序能夠更新同一個表中的不同行的數(shù)據(jù) 而不會引起鎖定的問題 只有InnoDB存儲引擎支持行級鎖定
建立索引
建立索引在搜索和恢復(fù)數(shù)據(jù)庫中的數(shù)據(jù)的時候能夠顯著提高性能 不同的存儲引擎提供不同的制作索引的技術(shù) 有些技術(shù)也許會更適合你存儲的數(shù)據(jù)類型
有些存儲引擎根本就不支持索引 其原因可能是它們使用基本表索引(如MERGE引擎)或者是因?yàn)閿?shù)據(jù)存儲的方式不允許索引(例如FEDERATED或者BLACKHOLE引擎)
事務(wù)處理
事務(wù)處理功能通過提供在向表中更新和插入信息期間的可靠性 這種可靠性是通過如下方法實(shí)現(xiàn)的 它允許你更新表中的數(shù)據(jù) 但僅當(dāng)應(yīng)用的應(yīng)用程序的所有相關(guān)操作完全完成后才接受你對表的更改 例如 在會計(jì)處理中每一筆會計(jì)分錄處理將包括對借方科目和貸方科目數(shù)據(jù)的更改 你需要要使用事務(wù)處理功能保證對借方科目和貸方科目的數(shù)據(jù)更改都順利完成 才接受所做的修改 如果任一項(xiàng)操作失敗了 你都可以取消這個事務(wù)處理 這些修改就不存在了 如果這個事務(wù)處理過程完成了 我們可以通過允許這個修改來確認(rèn)這個操作
lishixinzhi/Article/program/MySQL/201311/29301
1、使用show語句找出在服務(wù)器上當(dāng)前存在什么數(shù)據(jù)庫:
mysql
show
databases;
+----------+
|
database
|
+----------+
|
mysql
|
|
test
|
+----------+
3
rows
in
set
(0.00
sec)
2、創(chuàng)建一個數(shù)據(jù)庫abccs
mysql
create
database
abccs;
注意不同操作系統(tǒng)對大小寫的敏感。
3、選擇你所創(chuàng)建的數(shù)據(jù)庫
mysql
use
abccs
database
changed
此時你已經(jīng)進(jìn)入你剛才所建立的數(shù)據(jù)庫abccs.
4、
創(chuàng)建一個數(shù)據(jù)庫表
首先看現(xiàn)在你的數(shù)據(jù)庫中存在什么表:
mysql
show
tables;
empty
set
(0.00
sec)
說明剛才建立的數(shù)據(jù)庫中還沒有數(shù)據(jù)庫表。下面來創(chuàng)建一個數(shù)據(jù)庫表mytable:
我們要建立一個你公司員工的生日表,表的內(nèi)容包含員工姓名、性別、出生日期、出生城市。
mysql
create
table
mytable
(name
varchar(20),
sex
char(1),
-
birth
date,
birthaddr
varchar(20));
query
ok,
rows
affected
(0.00
sec)
由于name、birthadd的列值是變化的,因此選擇varchar,其長度不一定是20??梢赃x擇從1到255的任何長度,如果以后需要改變它的字長,可以使用alter
table語句。);性別只需一個字符就可以表示:"m"或"f",因此選用char(1);birth列則使用date數(shù)據(jù)類型。
創(chuàng)建了一個表后,我們可以看看剛才做的結(jié)果,用show
tables顯示數(shù)據(jù)庫中有哪些表:
mysql
show
tables;
+---------------------+
|
tables
in
menagerie
|
+---------------------+
|
mytables
|
+---------------------+
5、顯示表的結(jié)構(gòu):
mysql
describe
mytable;
+-------------+-------------+------+-----+---------+-------+
|
field
|
type
|
null
|
key
|
default
|
extra
|
+-------------+-------------+------+-----+---------+-------+
|
name
|
varchar(20)
|
yes
|
|
null
|
|
|
sex
|
char(1)
|
yes
|
|
null
|
|
|
birth
|
date
|
yes
|
|
null
|
|
|
deathaddr
|
varchar(20)
|
yes
|
|
null
|
|
+-------------+-------------+------+-----+---------+-------+
4
rows
in
set
(0.00
sec)
6、
往表中加入記錄
我們先用select命令來查看表中的數(shù)據(jù):
mysql
select
*
from
mytable;
empty
set
(0.00
sec)
這說明剛才創(chuàng)建的表還沒有記錄。
加入一條新記錄:
mysql
insert
into
mytable
-
values
(′abccs′,′f′,′1977-07-07′,′china′);
query
ok,
1
row
affected
(0.05
sec)
再用上面的select命令看看發(fā)生了什么變化。我們可以按此方法一條一條地將所有員工的記錄加入到表中。
MySQL有多種存儲引擎,每種存儲引擎有各自的優(yōu)缺點(diǎn),可以擇優(yōu)選擇使用:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
MySQL支持?jǐn)?shù)個存儲引擎作為對不同表的類型的處理器。MySQL存儲引擎包括處理事務(wù)安全表的引擎和處理非事務(wù)安全表的引擎:
· MyISAM管理非事務(wù)表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默認(rèn)的存儲引擎,除非你配置MySQL默認(rèn)使用另外一個引擎。
· MEMORY存儲引擎提供“內(nèi)存中”表。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作為一個單獨(dú)的表。就像MyISAM一樣,MEMORY和MERGE存儲引擎處理非事務(wù)表,這兩個引擎也都被默認(rèn)包含在MySQL中。
注釋:MEMORY存儲引擎正式地被確定為HEAP引擎。
· InnoDB和BDB存儲引擎提供事務(wù)安全表。BDB被包含在為支持它的操作系統(tǒng)發(fā)布的MySQL-Max二進(jìn)制分發(fā)版里。InnoDB也默認(rèn)被包括在所 有MySQL 5.1二進(jìn)制分發(fā)版里,你可以按照喜好通過配置MySQL來允許或禁止任一引擎。
· EXAMPLE存儲引擎是一個“存根”引擎,它不做什么。你可以用這個引擎創(chuàng)建表,但沒有數(shù)據(jù)被存儲于其中或從其中檢索。這個引擎的目的是服務(wù),在 MySQL源代碼中的一個例子,它演示說明如何開始編寫新存儲引擎。同樣,它的主要興趣是對開發(fā)者。
· NDB Cluster是被MySQL Cluster用來實(shí)現(xiàn)分割到多臺計(jì)算機(jī)上的表的存儲引擎。它在MySQL-Max 5.1二進(jìn)制分發(fā)版里提供。這個存儲引擎當(dāng)前只被Linux, Solaris, 和Mac OS X 支持。在未來的MySQL分發(fā)版中,我們想要添加其它平臺對這個引擎的支持,包括Windows。
· ARCHIVE存儲引擎被用來無索引地,非常小地覆蓋存儲的大量數(shù)據(jù)。
· CSV存儲引擎把數(shù)據(jù)以逗號分隔的格式存儲在文本文件中。
· BLACKHOLE存儲引擎接受但不存儲數(shù)據(jù),并且檢索總是返回一個空集。
· FEDERATED存儲引擎把數(shù)據(jù)存在遠(yuǎn)程數(shù)據(jù)庫中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未來的分發(fā)版中,我們想要讓它使用其它驅(qū)動器或客戶端連接方法連接到另外的數(shù)據(jù)源。
比較常用的是MyISAM和InnoBD
臨時表的存儲引擎
在 MySQL 5.6 之前,所有磁盤上的臨時表都默認(rèn)創(chuàng)建為 MyISAM 類型。臨時表是在內(nèi)存中,還是在磁盤上創(chuàng)建,具體取決于配置,并在查詢結(jié)束時立即刪除。從 MySQL 5.7 開始,它們默認(rèn)創(chuàng)建為 InnoDB 類型。
新默認(rèn)值可提升整體性能,大多數(shù)情況下都是最佳選擇。
可以使用新的配置項(xiàng)來設(shè)置臨時表的存儲引擎:internal_tmp_disk_storage_engine ,可選值為 InnoDB(默認(rèn))或 MyISAM。
InnoDB 類型的臨時表存在的潛在問題
盡管使用 InnoDB 是性能最佳的,但可能會出現(xiàn)新的潛在問題。在某些特定情況下,您可能會出現(xiàn)磁盤耗盡和服務(wù)器中斷。
與數(shù)據(jù)庫中的任何其他 InnoDB 表一樣,臨時表具有自己的表空間文件。新文件與通用表空間一起位于數(shù)據(jù)目錄中,名稱為 ibtmp1。它存儲所有 tmp 表。不運(yùn)行手動運(yùn)行 OPTIMIZE TABLE,表空間文件就會不斷增長。如果你不能使用 OPTIMIZE,那么唯一能將 ibtmp1 大小縮小為零的方法,就是重新啟動服務(wù)器。幸運(yùn)的是,即使文件無法減小,在執(zhí)行查詢后,臨時表也會自動刪除,表空間可回收使用?,F(xiàn)在,我們想一想以下情境:
存在未優(yōu)化的查詢,需要在磁盤上創(chuàng)建非常大的的臨時表
存在優(yōu)化的查詢,但他們正在磁盤上創(chuàng)建非常大的臨時表,因?yàn)槟阏趯Υ藬?shù)據(jù)集進(jìn)行計(jì)算(統(tǒng)計(jì),分析)
高并發(fā)連接時,運(yùn)行相同的查詢,伴隨臨時表的創(chuàng)建
沒有很多可用空間
在這些情況下,文件 ibtmp1 大大增加,很容易耗盡可用空間。這種情況每天發(fā)生幾次,并且必須重啟服務(wù)器才能完全縮小 ibtmp1 表空間。使用不可收縮的文件可以輕松耗盡磁盤空間!
MySQL中的存儲引擎:
1、存儲引擎的概念
2、查看MySQL所支持的存儲引擎
3、MySQL中幾種常用存儲引擎的特點(diǎn)
4、存儲引擎之間的相互轉(zhuǎn)化