存儲(chǔ)引擎是什么?
創(chuàng)新互聯(lián)公司專(zhuān)注于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)。公司秉持“客戶(hù)至上,用心服務(wù)”的宗旨,從客戶(hù)的利益和觀點(diǎn)出發(fā),讓客戶(hù)在網(wǎng)絡(luò)營(yíng)銷(xiāo)中找到自己的駐足之地。尊重和關(guān)懷每一位客戶(hù),用嚴(yán)謹(jǐn)?shù)膽B(tài)度對(duì)待客戶(hù),用專(zhuān)業(yè)的服務(wù)創(chuàng)造價(jià)值,成為客戶(hù)值得信賴(lài)的朋友,為客戶(hù)解除后顧之憂(yōu)。
MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或者內(nèi)存)中 這些技術(shù)中的每一種技術(shù)都使用不同的存儲(chǔ)機(jī)制 索引技巧 鎖定水平并且最終提供廣泛的不同的功能和能力 通過(guò)選擇不同的技術(shù) 你能夠獲得額外的速度或者功能 從而改善你的應(yīng)用的整體功能
例如 如果你在研究大量的臨時(shí)數(shù)據(jù) 你也許需要使用內(nèi)存存儲(chǔ)引擎 內(nèi)存存儲(chǔ)引擎能夠在內(nèi)存中存儲(chǔ)所有的表格數(shù)據(jù) 又或者 你也許需要一個(gè)支持事務(wù)處理的數(shù)據(jù)庫(kù)(以確保事務(wù)處理不成功時(shí)數(shù)據(jù)的回退能力)
這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱(chēng)作存儲(chǔ)引擎(也稱(chēng)作表類(lèi)型) MySQL默認(rèn)配置了許多不同的存儲(chǔ)引擎 可以預(yù)先設(shè)置或者在MySQL服務(wù)器中啟用 你可以選擇適用于服務(wù)器 數(shù)據(jù)庫(kù)和表格的存儲(chǔ)引擎 以便在選擇如何存儲(chǔ)你的信息 如何檢索這些信息以及你需要你的數(shù)據(jù)結(jié)合什么性能和功能的時(shí)候?yàn)槟闾峁┳畲蟮撵`活性
選擇如何存儲(chǔ)和檢索你的數(shù)據(jù)的這種靈活性是MySQL為什么如此受歡迎的主要原因 其它數(shù)據(jù)庫(kù)系統(tǒng)(包括大多數(shù)商業(yè)選擇)僅支持一種類(lèi)型的數(shù)據(jù)存儲(chǔ) 遺憾的是 其它類(lèi)型的數(shù)據(jù)庫(kù)解決方案采取的 一個(gè)尺碼滿(mǎn)足一切需求 的方式意味著你要么就犧牲一些性能 要么你就用幾個(gè)小時(shí)甚至幾天的時(shí)間詳細(xì)調(diào)整你的數(shù)據(jù)庫(kù) 使用MySQL 我們僅需要修改我們使用的存儲(chǔ)引擎就可以了
在這篇文章中 我們不準(zhǔn)備集中討論不同的存儲(chǔ)引擎的技術(shù)方面的問(wèn)題(盡管我們不可避免地要研究這些因素的某些方面) 相反 我們將集中介紹這些不同的引擎分別最適應(yīng)哪種需求和如何啟用不同的存儲(chǔ)引擎 為了實(shí)現(xiàn)這個(gè)目的 在介紹每一個(gè)存儲(chǔ)引擎的具體情況之前 我們必須要了解一些基本的問(wèn)題
如何確定有哪些存儲(chǔ)引擎可用
你可以在MySQL(假設(shè)是MySQL服務(wù)器 以上版本)中使用顯示引擎的命令得到一個(gè)可用引擎的列表
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)??
這個(gè)表格顯示了可用的數(shù)據(jù)庫(kù)引擎的全部名單以及在當(dāng)前的數(shù)據(jù)庫(kù)服務(wù)器中是否支持這些引擎
對(duì)于MySQL 以前版本 可以使用mysql show variables like have_% (顯示類(lèi)似 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)? ??
你可以通過(guò)修改設(shè)置腳本中的選項(xiàng)來(lái)設(shè)置在MySQL安裝軟件中可用的引擎 如果你在使用一個(gè)預(yù)先包裝好的MySQL二進(jìn)制發(fā)布版軟件 那么 這個(gè)軟件就包含了常用的引擎 然而 需要指出的是 如果你要使用某些不常用的引擎 特別是CSV RCHIVE(存檔)和BLACKHOLE(黑洞)引擎 你就需要手工重新編譯MySQL源碼
使用一個(gè)指定的存儲(chǔ)引擎
你可以使用很多方法指定一個(gè)要使用的存儲(chǔ)引擎 最簡(jiǎn)單的方法是 如果你喜歡一種能滿(mǎn)足你的大多數(shù)數(shù)據(jù)庫(kù)需求的存儲(chǔ)引擎 你可以在MySQL設(shè)置文件中設(shè)置一個(gè)默認(rèn)的引擎類(lèi)型(使用storage_engine 選項(xiàng))或者在啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)器時(shí)在命令行后面加上 default storage engine或 default table type選項(xiàng)
更靈活的方式是在隨MySQL服務(wù)器發(fā)布同時(shí)提供的MySQL客戶(hù)端時(shí)指定使用的存儲(chǔ)引擎 最直接的方式是在創(chuàng)建表時(shí)指定存儲(chǔ)引擎的類(lèi)型 向下面這樣:
CREATE TABLE mytable (id int title char( )) ENGINE = INNODB
你還可以改變現(xiàn)有的表使用的存儲(chǔ)引擎 用以下語(yǔ)句:
ALTER TABLE mytable ENGINE = MyISAM
然而 你在以這種方式修改表格類(lèi)型的時(shí)候需要非常仔細(xì) 因?yàn)閷?duì)不支持同樣的索引 字段類(lèi)型或者表大小的一個(gè)類(lèi)型進(jìn)行修改可能使你丟失數(shù)據(jù) 如果你指定一個(gè)在你的當(dāng)前的數(shù)據(jù)庫(kù)中不存在的一個(gè)存儲(chǔ)引擎 那么就會(huì)創(chuàng)建一個(gè)MyISAM(默認(rèn)的)類(lèi)型的表
各存儲(chǔ)引擎之間的區(qū)別
為了做出選擇哪一個(gè)存儲(chǔ)引擎的決定 我們首先需要考慮每一個(gè)存儲(chǔ)引擎提供了哪些不同的核心功能 這種功能使我們能夠把不同的存儲(chǔ)引擎區(qū)別開(kāi)來(lái) 我們一般把這些核心功能分為四類(lèi):支持的字段和數(shù)據(jù)類(lèi)型 鎖定類(lèi)型 索引和處理 一些引擎具有能過(guò)促使你做出決定的獨(dú)特的功能 我們一會(huì)兒再仔細(xì)研究這些具體問(wèn)題
字段和數(shù)據(jù)類(lèi)型
雖然所有這些引擎都支持通用的數(shù)據(jù)類(lèi)型 例如整型 實(shí)型和字符型等 但是 并不是所有的引擎都支持其它的字段類(lèi)型 特別是BLOG(二進(jìn)制大對(duì)象)或者TEXT文本類(lèi)型 其它引擎也許僅支持有限的字符寬度和數(shù)據(jù)大小
這些局限性可能直接影響到你可以存儲(chǔ)的數(shù)據(jù) 同時(shí)也可能會(huì)對(duì)你實(shí)施的搜索的類(lèi)型或者你對(duì)那些信息創(chuàng)建的索引產(chǎn)生間接的影響 這些區(qū)別能夠影響你的應(yīng)用程序的性能和功能 因?yàn)槟惚仨氁鶕?jù)你要存儲(chǔ)的數(shù)據(jù)類(lèi)型選擇對(duì)需要的存儲(chǔ)引擎的功能做出決策
鎖定
數(shù)據(jù)庫(kù)引擎中的鎖定功能決定了如何管理信息的訪(fǎng)問(wèn)和更新 當(dāng)數(shù)據(jù)庫(kù)中的一個(gè)對(duì)象為信息更新鎖定了 在更新完成之前 其它處理不能修改這個(gè)數(shù)據(jù)(在某些情況下還不允許讀這種數(shù)據(jù))
鎖定不僅影響許多不同的應(yīng)用程序如何更新數(shù)據(jù)庫(kù)中的信息 而且還影響對(duì)那個(gè)數(shù)據(jù)的查詢(xún) 這是因?yàn)椴樵?xún)可能要訪(fǎng)問(wèn)正在被修改或者更新的數(shù)據(jù) 總的來(lái)說(shuō) 這種延遲是很小的 大多數(shù)鎖定機(jī)制主要是為了防止多個(gè)處理更新同一個(gè)數(shù)據(jù) 由于向數(shù)據(jù)中插入信息和更新信息這兩種情況都需要鎖定 你可以想象 多個(gè)應(yīng)用程序使用同一個(gè)數(shù)據(jù)庫(kù)可能會(huì)有很大的影響
不同的存儲(chǔ)引擎在不同的對(duì)象級(jí)別支持鎖定 而且這些級(jí)別將影響可以同時(shí)訪(fǎng)問(wèn)的信息 得到支持的級(jí)別有三種:表鎖定 塊鎖定和行鎖定 支持最多的是表鎖定 這種鎖定是在MyISAM中提供的 在數(shù)據(jù)更新時(shí) 它鎖定了整個(gè)表 這就防止了許多應(yīng)用程序同時(shí)更新一個(gè)具體的表 這對(duì)應(yīng)用很多的多用戶(hù)數(shù)據(jù)庫(kù)有很大的影響 因?yàn)樗舆t了更新的過(guò)程
頁(yè)級(jí)鎖定使用Berkeley DB引擎 并且根據(jù)上載的信息頁(yè)( KB)鎖定數(shù)據(jù) 當(dāng)在數(shù)據(jù)庫(kù)的很多地方進(jìn)行更新的時(shí)候 這種鎖定不會(huì)出現(xiàn)什么問(wèn)題 但是 由于增加幾行信息就要鎖定數(shù)據(jù)結(jié)構(gòu)的最后 KB 當(dāng)需要增加大量的行 也別是大量的小型數(shù)據(jù) 就會(huì)帶來(lái)問(wèn)題
行級(jí)鎖定提供了最佳的并行訪(fǎng)問(wèn)功能 一個(gè)表中只有一行數(shù)據(jù)被鎖定 這就意味著很多應(yīng)用程序能夠更新同一個(gè)表中的不同行的數(shù)據(jù) 而不會(huì)引起鎖定的問(wèn)題 只有InnoDB存儲(chǔ)引擎支持行級(jí)鎖定
建立索引
建立索引在搜索和恢復(fù)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的時(shí)候能夠顯著提高性能 不同的存儲(chǔ)引擎提供不同的制作索引的技術(shù) 有些技術(shù)也許會(huì)更適合你存儲(chǔ)的數(shù)據(jù)類(lèi)型
有些存儲(chǔ)引擎根本就不支持索引 其原因可能是它們使用基本表索引(如MERGE引擎)或者是因?yàn)閿?shù)據(jù)存儲(chǔ)的方式不允許索引(例如FEDERATED或者BLACKHOLE引擎)
事務(wù)處理
事務(wù)處理功能通過(guò)提供在向表中更新和插入信息期間的可靠性 這種可靠性是通過(guò)如下方法實(shí)現(xiàn)的 它允許你更新表中的數(shù)據(jù) 但僅當(dāng)應(yīng)用的應(yīng)用程序的所有相關(guān)操作完全完成后才接受你對(duì)表的更改 例如 在會(huì)計(jì)處理中每一筆會(huì)計(jì)分錄處理將包括對(duì)借方科目和貸方科目數(shù)據(jù)的更改 你需要要使用事務(wù)處理功能保證對(duì)借方科目和貸方科目的數(shù)據(jù)更改都順利完成 才接受所做的修改 如果任一項(xiàng)操作失敗了 你都可以取消這個(gè)事務(wù)處理 這些修改就不存在了 如果這個(gè)事務(wù)處理過(guò)程完成了 我們可以通過(guò)允許這個(gè)修改來(lái)確認(rèn)這個(gè)操作
lishixinzhi/Article/program/MySQL/201311/29301
臨時(shí)表的存儲(chǔ)引擎
在 MySQL 5.6 之前,所有磁盤(pán)上的臨時(shí)表都默認(rèn)創(chuàng)建為 MyISAM 類(lèi)型。臨時(shí)表是在內(nèi)存中,還是在磁盤(pán)上創(chuàng)建,具體取決于配置,并在查詢(xún)結(jié)束時(shí)立即刪除。從 MySQL 5.7 開(kāi)始,它們默認(rèn)創(chuàng)建為 InnoDB 類(lèi)型。
新默認(rèn)值可提升整體性能,大多數(shù)情況下都是最佳選擇。
可以使用新的配置項(xiàng)來(lái)設(shè)置臨時(shí)表的存儲(chǔ)引擎:internal_tmp_disk_storage_engine ,可選值為 InnoDB(默認(rèn))或 MyISAM。
InnoDB 類(lèi)型的臨時(shí)表存在的潛在問(wèn)題
盡管使用 InnoDB 是性能最佳的,但可能會(huì)出現(xiàn)新的潛在問(wèn)題。在某些特定情況下,您可能會(huì)出現(xiàn)磁盤(pán)耗盡和服務(wù)器中斷。
與數(shù)據(jù)庫(kù)中的任何其他 InnoDB 表一樣,臨時(shí)表具有自己的表空間文件。新文件與通用表空間一起位于數(shù)據(jù)目錄中,名稱(chēng)為 ibtmp1。它存儲(chǔ)所有 tmp 表。不運(yùn)行手動(dòng)運(yùn)行 OPTIMIZE TABLE,表空間文件就會(huì)不斷增長(zhǎng)。如果你不能使用 OPTIMIZE,那么唯一能將 ibtmp1 大小縮小為零的方法,就是重新啟動(dòng)服務(wù)器。幸運(yùn)的是,即使文件無(wú)法減小,在執(zhí)行查詢(xún)后,臨時(shí)表也會(huì)自動(dòng)刪除,表空間可回收使用?,F(xiàn)在,我們想一想以下情境:
存在未優(yōu)化的查詢(xún),需要在磁盤(pán)上創(chuàng)建非常大的的臨時(shí)表
存在優(yōu)化的查詢(xún),但他們正在磁盤(pán)上創(chuàng)建非常大的臨時(shí)表,因?yàn)槟阏趯?duì)此數(shù)據(jù)集進(jìn)行計(jì)算(統(tǒng)計(jì),分析)
高并發(fā)連接時(shí),運(yùn)行相同的查詢(xún),伴隨臨時(shí)表的創(chuàng)建
沒(méi)有很多可用空間
在這些情況下,文件 ibtmp1 大大增加,很容易耗盡可用空間。這種情況每天發(fā)生幾次,并且必須重啟服務(wù)器才能完全縮小 ibtmp1 表空間。使用不可收縮的文件可以輕松耗盡磁盤(pán)空間!
mysql 5.5以前默認(rèn)的引擎是myisam,5.5以后是innodb,引擎可以在創(chuàng)建表的時(shí)候指定,如下:
Ceate table test
(id int,name varchar(10))
engine innodb;
修改:
alter table test type=innodb;
如果想設(shè)置缺省引擎可以在配置文件的mysqld添加一行:
default-storage-engine=INNODB;
首先確定,在mysql的'plugin_dir'下有ha_innodb_plugin.so和ha_innodb.so兩個(gè)文件
查詢(xún)'plugin_dir'的路徑可以用以下命令
mysql show variables like 'plugin_dir';
+---------------+-----------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------+
| plugin_dir | /usr/local/mysql/lib/mysql/plugin |
+---------------+-----------------------------------+
1 row in set (0.01 sec)
如果沒(méi)有找到,在您的mysql編譯目錄里有下面的目錄文件(內(nèi)置的innodb和innodb_plugin)
storage/innobase/.libs/ha_innodb.so
storage/innodb_plugin/.libs/ha_innodb_plugin.so
您需要把它們(ha_innodb_plugin.so和ha_innodb.so)拷貝到mysql的plugin目錄中(/usr/local/mysql/lib/mysql/plugin)
接下來(lái)就是在mysql命令行安裝一下
# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.1.36-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql show engines;
+------------+---------+-----------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+------------+---------+-----------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
+------------+---------+-----------------------------------------------------------+--------------+------+------------+
4 rows in set (0.00 sec)
mysql INSTALL PLUGIN InnoDB SONAME 'ha_innodb.so';
Query OK, 0 rows affected (0.69 sec)
mysql show engines;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
5 rows in set (0.00 sec)
OK,大功告成