python入門(mén)開(kāi)發(fā)學(xué)習(xí)筆記之存儲(chǔ)引擎

本節(jié)重點(diǎn)

  • 了解存儲(chǔ)引擎

本節(jié)時(shí)長(zhǎng)需控制在10分鐘內(nèi)

一 什么是存儲(chǔ)引擎

mysql中建立的庫(kù)===>文件夾

庫(kù)中建立的表===>文件

現(xiàn)實(shí)生活中我們用來(lái)存儲(chǔ)數(shù)據(jù)的文件有不同的類(lèi)型,每種文件類(lèi)型對(duì)應(yīng)各自不同的處理機(jī)制:比如處理文本用txt類(lèi)型,處理表格用excel,處理圖片用png等

數(shù)據(jù)庫(kù)中的表也應(yīng)該有不同的類(lèi)型,表的類(lèi)型不同,會(huì)對(duì)應(yīng)mysql不同的存取機(jī)制,表類(lèi)型又稱(chēng)為存儲(chǔ)引擎。

存儲(chǔ)引擎說(shuō)白了就是如何存儲(chǔ)數(shù)據(jù)、如何為存儲(chǔ)的數(shù)據(jù)建立索引和如何更新、查詢數(shù)據(jù)等技術(shù)的實(shí)現(xiàn)方
法。因?yàn)樵陉P(guān)系數(shù)據(jù)庫(kù)中數(shù)據(jù)的存儲(chǔ)是以表的形式存儲(chǔ)的,所以存儲(chǔ)引擎也可以稱(chēng)為表類(lèi)型(即存儲(chǔ)和
操作此表的類(lèi)型)

在Oracle 和SQL Server等數(shù)據(jù)庫(kù)中只有一種存儲(chǔ)引擎,所有數(shù)據(jù)存儲(chǔ)管理機(jī)制都是一樣的。而MySql
數(shù)據(jù)庫(kù)提供了多種存儲(chǔ)引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲(chǔ)引擎,用戶也可以根據(jù)
自己的需要編寫(xiě)自己的存儲(chǔ)引擎

SQL 解析器、SQL 優(yōu)化器、緩沖池、存儲(chǔ)引擎等組件在每個(gè)數(shù)據(jù)庫(kù)中都存在,但不是每 個(gè)數(shù)據(jù)庫(kù)都有這么多存儲(chǔ)引擎。MySQL 的插件式存儲(chǔ)引擎可以讓存儲(chǔ)引擎層的開(kāi)發(fā)人員設(shè) 計(jì)他們希望的存儲(chǔ)層,例如,有的應(yīng)用需要滿足事務(wù)的要求,有的應(yīng)用則不需要對(duì)事務(wù)有這 么強(qiáng)的要求 ;有的希望數(shù)據(jù)能持久存儲(chǔ),有的只希望放在內(nèi)存中,臨時(shí)并快速地提供對(duì)數(shù)據(jù) 的查詢。

二 mysql支持的存儲(chǔ)引擎

MariaDB [(none)]> show engines\G  #查看所有支持的存儲(chǔ)引擎

MariaDB [(none)]> show variables like 'storage_engine%'; #查看正在使用的存儲(chǔ)引擎

1、InnoDB 存儲(chǔ)引擎

支持事務(wù),其設(shè)計(jì)目標(biāo)主要面向聯(lián)機(jī)事務(wù)處理(OLTP)的應(yīng)用。其

特點(diǎn)是行鎖設(shè)計(jì)、支持外鍵,并支持類(lèi)似 Oracle 的非鎖定讀,即默認(rèn)讀取操作不會(huì)產(chǎn)生鎖。 從 MySQL 5.5.8 版本開(kāi)始是默認(rèn)的存儲(chǔ)引擎。

InnoDB 存儲(chǔ)引擎將數(shù)據(jù)放在一個(gè)邏輯的表空間中,這個(gè)表空間就像黑盒一樣由 InnoDB 存儲(chǔ)引擎自身來(lái)管理。從 MySQL 4.1(包括 4.1)版本開(kāi)始,可以將每個(gè) InnoDB 存儲(chǔ)引擎的 表單獨(dú)存放到一個(gè)獨(dú)立的 ibd 文件中。此外,InnoDB 存儲(chǔ)引擎支持將裸設(shè)備(row disk)用 于建立其表空間。

InnoDB 通過(guò)使用多版本并發(fā)控制(MVCC)來(lái)獲得高并發(fā)性,并且實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn) 的 4 種隔離級(jí)別,默認(rèn)為 REPEATABLE 級(jí)別,同時(shí)使用一種稱(chēng)為 netx-key locking 的策略來(lái) 避免幻讀(phantom)現(xiàn)象的產(chǎn)生。除此之外,InnoDB 存儲(chǔ)引擎還提供了插入緩沖(insert buffer)、二次寫(xiě)(double write)、自適應(yīng)哈希索引(adaptive hash index)、預(yù)讀(read ahead) 等高性能和高可用的功能。

對(duì)于表中數(shù)據(jù)的存儲(chǔ),InnoDB 存儲(chǔ)引擎采用了聚集(clustered)的方式,每張表都是按 主鍵的順序進(jìn)行存儲(chǔ)的,如果沒(méi)有顯式地在表定義時(shí)指定主鍵,InnoDB 存儲(chǔ)引擎會(huì)為每一 行生成一個(gè) 6 字節(jié)的 ROWID,并以此作為主鍵。

InnoDB 存儲(chǔ)引擎是 MySQL 數(shù)據(jù)庫(kù)最為常用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應(yīng)用已經(jīng)證明了 InnoDB 存儲(chǔ)引擎具備高可用性、高性能以及高可擴(kuò)展性。對(duì)其 底層實(shí)現(xiàn)的掌握和理解也需要時(shí)間和技術(shù)的積累。如果想深入了解 InnoDB 存儲(chǔ)引擎的工作 原理、實(shí)現(xiàn)和應(yīng)用,可以參考《MySQL 技術(shù)內(nèi)幕:InnoDB 存儲(chǔ)引擎》一書(shū)。

2、MyISAM 存儲(chǔ)引擎

不支持事務(wù)、表鎖設(shè)計(jì)、支持全文索引,主要面向一些 OLAP 數(shù) 據(jù)庫(kù)應(yīng)用,在 MySQL 5.5.8 版本之前是默認(rèn)的存儲(chǔ)引擎(除 Windows 版本外)。數(shù)據(jù)庫(kù)系統(tǒng) 與文件系統(tǒng)一個(gè)很大的不同在于對(duì)事務(wù)的支持,MyISAM 存儲(chǔ)引擎是不支持事務(wù)的。究其根 本,這也并不難理解。用戶在所有的應(yīng)用中是否都需要事務(wù)呢?在數(shù)據(jù)倉(cāng)庫(kù)中,如果沒(méi)有 ETL 這些操作,只是簡(jiǎn)單地通過(guò)報(bào)表查詢還需要事務(wù)的支持嗎?此外,MyISAM 存儲(chǔ)引擎的 另一個(gè)與眾不同的地方是,它的緩沖池只緩存(cache)索引文件,而不緩存數(shù)據(jù)文件,這與 大多數(shù)的數(shù)據(jù)庫(kù)都不相同。

3、NDB 存儲(chǔ)引擎

年,MySQL AB 公司從 Sony Ericsson 公司收購(gòu)了 NDB 存儲(chǔ)引擎。 NDB 存儲(chǔ)引擎是一個(gè)集群存儲(chǔ)引擎,類(lèi)似于 Oracle 的 RAC 集群,不過(guò)與 Oracle RAC 的 share everything 結(jié)構(gòu)不同的是,其結(jié)構(gòu)是 share nothing 的集群架構(gòu),因此能提供更高級(jí)別的 高可用性。NDB 存儲(chǔ)引擎的特點(diǎn)是數(shù)據(jù)全部放在內(nèi)存中(從 5.1 版本開(kāi)始,可以將非索引數(shù) 據(jù)放在磁盤(pán)上),因此主鍵查找(primary key lookups)的速度極快,并且能夠在線添加 NDB 數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)(data node)以便線性地提高數(shù)據(jù)庫(kù)性能。由此可見(jiàn),NDB 存儲(chǔ)引擎是高可用、 高性能、高可擴(kuò)展性的數(shù)據(jù)庫(kù)集群系統(tǒng),其面向的也是 OLTP 的數(shù)據(jù)庫(kù)應(yīng)用類(lèi)型。

4、Memory 存儲(chǔ)引擎

正如其名,Memory 存儲(chǔ)引擎中的數(shù)據(jù)都存放在內(nèi)存中,數(shù)據(jù)庫(kù)重 啟或發(fā)生崩潰,表中的數(shù)據(jù)都將消失。它非常適合于存儲(chǔ) OLTP 數(shù)據(jù)庫(kù)應(yīng)用中臨時(shí)數(shù)據(jù)的臨時(shí)表,也可以作為 OLAP 數(shù)據(jù)庫(kù)應(yīng)用中數(shù)據(jù)倉(cāng)庫(kù)的維度表。Memory 存儲(chǔ)引擎默認(rèn)使用哈希 索引,而不是通常熟悉的 B+ 樹(shù)索引。

5、Infobright 存儲(chǔ)引擎

第三方的存儲(chǔ)引擎。其特點(diǎn)是存儲(chǔ)是按照列而非行的,因此非常 適合 OLAP 的數(shù)據(jù)庫(kù)應(yīng)用。其官方網(wǎng)站是 http://www.infobright.org/,上面有不少成功的數(shù)據(jù) 倉(cāng)庫(kù)案例可供分析。

6、NTSE 存儲(chǔ)引擎

網(wǎng)易公司開(kāi)發(fā)的面向其內(nèi)部使用的存儲(chǔ)引擎。目前的版本不支持事務(wù), 但提供壓縮、行級(jí)緩存等特性,不久的將來(lái)會(huì)實(shí)現(xiàn)面向內(nèi)存的事務(wù)支持。

7、BLACKHOLE

黑洞存儲(chǔ)引擎,可以應(yīng)用于主備復(fù)制中的分發(fā)主庫(kù)。

MySQL 數(shù)據(jù)庫(kù)還有很多其他存儲(chǔ)引擎,上述只是列舉了最為常用的一些引擎。如果 你喜歡,完全可以編寫(xiě)專(zhuān)屬于自己的引擎,這就是開(kāi)源賦予我們的能力,也是開(kāi)源的魅 力所在。

三 使用存儲(chǔ)引擎

方法1:建表時(shí)指定

MariaDB [db1]> create table innodb_t1(id int,name char)engine=innodb;
MariaDB [db1]> create table innodb_t2(id int)engine=innodb;
MariaDB [db1]> show create table innodb_t1;
MariaDB [db1]> show create table innodb_t2;

方法2:在配置文件中指定默認(rèn)的存儲(chǔ)引擎

/etc/my.cnf
[mysqld]
default-storage-engine=INNODB
innodb_file_per_table=1

查看

[root@egon db1]# cd /var/lib/mysql/db1/
[root@egon db1]# ls
db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

練習(xí)

創(chuàng)建四個(gè)表,分別使用innodb,myisam,memory,blackhole存儲(chǔ)引擎,進(jìn)行插入數(shù)據(jù)測(cè)試

MariaDB [db1]> create table t1(id int)engine=innodb;
MariaDB [db1]> create table t2(id int)engine=myisam;
MariaDB [db1]> create table t3(id int)engine=memory;
MariaDB [db1]> create table t4(id int)engine=blackhole;
MariaDB [db1]> quit
[root@egon db1]# ls /var/lib/mysql/db1/ #發(fā)現(xiàn)后兩種存儲(chǔ)引擎只有表結(jié)構(gòu),無(wú)數(shù)據(jù)
db.opt  t1.frm  t1.ibd  t2.MYD  t2.MYI  t2.frm  t3.frm  t4.frm

#memory,在重啟mysql或者重啟機(jī)器后,表內(nèi)數(shù)據(jù)清空
#blackhole,往表內(nèi)插入任何數(shù)據(jù),都相當(dāng)于丟入黑洞,表內(nèi)永遠(yuǎn)不存記錄
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容