mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了
存儲(chǔ)引擎是MySQL的組件,用于處理不同表類型的SQL操作。不同的存儲(chǔ)引擎提供不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平等功能,使用不同的存儲(chǔ)引擎,還可以獲得特定的功能。
使用哪一種引擎可以靈活選擇,一個(gè)數(shù)據(jù)庫(kù)中多個(gè)表可以使用不同引擎以滿足各種性能和實(shí)際需求,使用合適的存儲(chǔ)引擎,將會(huì)提高整個(gè)數(shù)據(jù)庫(kù)的性能 。
MySQL服務(wù)器使用可插拔的存儲(chǔ)引擎體系結(jié)構(gòu),可以從運(yùn)行中的MySQL服務(wù)器加載或卸載存儲(chǔ)引擎。
一、查看存儲(chǔ)引擎
-- 查看支持的存儲(chǔ)引擎SHOW ENGINES-- 查看默認(rèn)存儲(chǔ)引擎SHOW VARIABLES LIKE 'storage_engine--查看具體某一個(gè)表所使用的存儲(chǔ)引擎,這個(gè)默認(rèn)存儲(chǔ)引擎被修改了!show create table tablename--準(zhǔn)確查看某個(gè)數(shù)據(jù)庫(kù)中的某一表所使用的存儲(chǔ)引擎show table status like 'tablename'show table status from database where name="tablename"二、設(shè)置存儲(chǔ)引擎
-- 建表時(shí)指定存儲(chǔ)引擎。默認(rèn)的就是INNODB,不需要設(shè)置CREATE TABLE t1 (i INT) ENGINE = INNODB;CREATE TABLE t2 (i INT) ENGINE = CSV;CREATE TABLE t3 (i INT) ENGINE = MEMORY;-- 修改存儲(chǔ)引擎ALTER TABLE t ENGINE = InnoDB;-- 修改默認(rèn)存儲(chǔ)引擎,也可以在配置文件my.cnf中修改默認(rèn)引擎SET default_storage_engine=NDBCLUSTER;默認(rèn)情況下,每當(dāng)CREATE TABLE或ALTER TABLE不能使用默認(rèn)存儲(chǔ)引擎時(shí),都會(huì)生成一個(gè)警告。為了防止在所需的引擎不可用時(shí)出現(xiàn)令人困惑的意外行為,可以啟用NO_ENGINE_SUBSTITUTION SQL模式。如果所需的引擎不可用,則此設(shè)置將產(chǎn)生錯(cuò)誤而不是警告,并且不會(huì)創(chuàng)建或更改表
三、常用存儲(chǔ)引擎
1. InnoDB
InnoDB是MySQL5.7 默認(rèn)的存儲(chǔ)引擎,主要特性有
- InnoDB存儲(chǔ)引擎維護(hù)自己的緩沖池,在訪問(wèn)數(shù)據(jù)時(shí)將表和索引數(shù)據(jù)緩存在主內(nèi)存中
- 支持事務(wù)
- 支持外鍵
- B-Tree索引
- 不支持集群
- 聚簇索引
- 行鎖
- 支持地理位置的數(shù)據(jù)類型和索引
2. MyISAM
每個(gè)MyISAM表存儲(chǔ)在磁盤上的三個(gè)文件中 。這些文件的名稱以表名開頭,并有一個(gè)擴(kuò)展名來(lái)指示文件類型 。
.frm文件存儲(chǔ)表的格式。 .MYD (MYData) 文件存儲(chǔ)表的數(shù)據(jù)。 .MYI (MYIndex) 文件存儲(chǔ)索引。
MyISAM表具有以下特征
- 每個(gè)MyISAM表最大索引數(shù)是64,這可以通過(guò)重新編譯來(lái)改變。每個(gè)索引最大的列數(shù)是16
- 每個(gè)MyISAM表都支持一個(gè)AUTO_INCREMENT的內(nèi)部列。當(dāng)執(zhí)行INSERT或者UPDATE操作的時(shí)候,MyISAM自動(dòng)更新這個(gè)列,這使得AUTO_INCREMENT列更快。
- 當(dāng)把刪除和更新及插入操作混合使用的時(shí)候,動(dòng)態(tài)尺寸的行產(chǎn)生更少碎片。這要通過(guò)合并相鄰被刪除的塊,若下一個(gè)塊被刪除,就擴(kuò)展到下一塊自動(dòng)完成
- MyISAM支持并發(fā)插入
- 可以將數(shù)據(jù)文件和索引文件放在不同物理設(shè)備上的不同目錄中,以更快地使用數(shù)據(jù)目錄和索引目錄表選項(xiàng)來(lái)創(chuàng)建表
- BLOB和TEXT列可以被索引
- NULL被允許在索引的列中,這個(gè)值占每個(gè)鍵的0~1個(gè)字節(jié)
- 每個(gè)字符列可以有不同的字符集
- MyISAM 表使用 B-tree 索引
- MyISAM表的行最大限制為 (232)2 (1.844E+19)
- 大文件(達(dá)到63位文件長(zhǎng)度)在支持大文件的文件系統(tǒng)和操作系統(tǒng)上被支持
- 鍵的最大長(zhǎng)度為1000字節(jié),這也可以通過(guò)重新編譯來(lái)改變,對(duì)于鍵長(zhǎng)度超過(guò)250字節(jié)的情況,一個(gè)超過(guò)1024字節(jié)的鍵將被用上
- VARCHAR支持固定或動(dòng)態(tài)記錄長(zhǎng)度
- 表中VARCHAR和CHAR列的長(zhǎng)度總和有可能達(dá)到64KB
- 任意長(zhǎng)度的唯一約束
- All data values are stored with the low byte first. This makes the data machine and operating system independent.
- All numeric key values are stored with the high byte first to permit better index compression
todo:最后兩條沒(méi)搞懂啥意思
四、存儲(chǔ)引擎對(duì)比
五、數(shù)據(jù)的存儲(chǔ)
在整個(gè)數(shù)據(jù)庫(kù)體系結(jié)構(gòu)中,我們可以使用不同的存儲(chǔ)引擎來(lái)存儲(chǔ)數(shù)據(jù),而絕大多數(shù)存儲(chǔ)引擎都以二進(jìn)制的形式存儲(chǔ)數(shù)據(jù);這一節(jié)會(huì)介紹 InnoDB 中對(duì)數(shù)據(jù)是如何存儲(chǔ)的。
在 InnoDB 存儲(chǔ)引擎中,所有的數(shù)據(jù)都被邏輯地存放在表空間中,表空間(tablespace)是存儲(chǔ)引擎中最高的存儲(chǔ)邏輯單位,在表空間的下面又包括段(segment)、區(qū)(extent)、頁(yè)(page)
同一個(gè)數(shù)據(jù)庫(kù)實(shí)例的所有表空間都有相同的頁(yè)大小;默認(rèn)情況下,表空間中的頁(yè)大小都為 16KB,當(dāng)然也可以通過(guò)改變 innodb_page_size 選項(xiàng)對(duì)默認(rèn)大小進(jìn)行修改,需要注意的是不同的頁(yè)大小最終也會(huì)導(dǎo)致區(qū)大小的不同
1. 如何存儲(chǔ)表
MySQL 使用 InnoDB 存儲(chǔ)表時(shí),會(huì)將表的定義和數(shù)據(jù)索引等信息分開存儲(chǔ),其中前者存儲(chǔ)在 .frm 文件中,后者存儲(chǔ)在 .ibd 文件中,這一節(jié)就會(huì)對(duì)這兩種不同的文件分別進(jìn)行介紹。
①. .frm 文件
無(wú)論在 MySQL 中選擇了哪個(gè)存儲(chǔ)引擎,所有的 MySQL 表都會(huì)在硬盤上創(chuàng)建一個(gè) .frm 文件用來(lái)描述表的格式或者說(shuō)定義;.frm 文件的格式在不同的平臺(tái)上都是相同的。
`CREATE TABLE test_frm(`` ``column1 CHAR(5),`` ``column2 INTEGER``);`當(dāng)我們使用上面的代碼創(chuàng)建表時(shí),會(huì)在磁盤上的 datadir 文件夾中生成一個(gè) test_frm.frm 的文件,這個(gè)文件中就包含了表結(jié)構(gòu)相關(guān)的信息:
②. .ibd 文件
InnoDB 中用于存儲(chǔ)數(shù)據(jù)的文件總共有兩個(gè)部分,一是系統(tǒng)表空間文件,包括 ibdata1、ibdata2 等文件,其中存儲(chǔ)了 InnoDB 系統(tǒng)信息和用戶數(shù)據(jù)庫(kù)表數(shù)據(jù)和索引,是所有表公用的。
當(dāng)打開 innodb_file_per_table 選項(xiàng)時(shí),.ibd 文件就是每一個(gè)表獨(dú)有的表空間,文件存儲(chǔ)了當(dāng)前表的數(shù)據(jù)和相關(guān)的索引數(shù)據(jù)。
2. 如何存儲(chǔ)記錄
與現(xiàn)有的大多數(shù)存儲(chǔ)引擎一樣,InnoDB 使用頁(yè)作為磁盤管理的最小單位;數(shù)據(jù)在 InnoDB 存儲(chǔ)引擎中都是按行存儲(chǔ)的,每個(gè) 16KB 大小的頁(yè)中可以存放 2-7992 行的記錄。(至少是2條記錄,最多是7992條記錄)
當(dāng) InnoDB 存儲(chǔ)數(shù)據(jù)時(shí),它可以使用不同的行格式進(jìn)行存儲(chǔ);MySQL 5.7 版本支持以下格式的行存儲(chǔ)方式:
Antelope 是 InnoDB 最開始支持的文件格式,它包含兩種行格式 Compact 和 Redundant,它最開始并沒(méi)有名字;Antelope 的名字是在新的文件格式 Barracuda 出現(xiàn)后才起的,Barracuda 的出現(xiàn)引入了兩種新的行格式 Compressed 和 Dynamic;InnoDB 對(duì)于文件格式都會(huì)向前兼容,而官方文檔中也對(duì)之后會(huì)出現(xiàn)的新文件格式預(yù)先定義好了名字:Cheetah、Dragon、Elk 等等。
兩種行記錄格式 Compact 和 Redundant 在磁盤上按照以下方式存儲(chǔ):
Compact 和 Redundant 格式最大的不同就是記錄格式的第一個(gè)部分;在 Compact 中,行記錄的第一部分倒序存放了一行數(shù)據(jù)中列的長(zhǎng)度(Length),而 Redundant 中存的是每一列的偏移量(Offset),從總體上上看,Compact 行記錄格式相比 Redundant 格式能夠減少 20% 的存儲(chǔ)空間。
3. 行溢出數(shù)據(jù)
當(dāng) InnoDB 使用 Compact 或者 Redundant 格式存儲(chǔ)極長(zhǎng)的 VARCHAR 或者 BLOB 這類大對(duì)象時(shí),我們并不會(huì)直接將所有的內(nèi)容都存放在數(shù)據(jù)頁(yè)節(jié)點(diǎn)中,而是將行數(shù)據(jù)中的前 768 個(gè)字節(jié)存儲(chǔ)在數(shù)據(jù)頁(yè)中,后面會(huì)通過(guò)偏移量指向溢出頁(yè)。
但是當(dāng)我們使用新的行記錄格式 Compressed 或者 Dynamic 時(shí)都只會(huì)在行記錄中保存 20 個(gè)字節(jié)的指針,實(shí)際的數(shù)據(jù)都會(huì)存放在溢出頁(yè)面中。
當(dāng)然在實(shí)際存儲(chǔ)中,可能會(huì)對(duì)不同長(zhǎng)度的 TEXT 和 BLOB 列進(jìn)行優(yōu)化,不過(guò)這就不是本文關(guān)注的重點(diǎn)了。
4. 數(shù)據(jù)頁(yè)結(jié)構(gòu)
頁(yè)是 InnoDB 存儲(chǔ)引擎管理數(shù)據(jù)的最小磁盤單位,而 B-Tree 節(jié)點(diǎn)就是實(shí)際存放表中數(shù)據(jù)的頁(yè)面,我們?cè)谶@里將要介紹頁(yè)是如何組織和存儲(chǔ)記錄的;首先,一個(gè) InnoDB 頁(yè)有以下七個(gè)部分:
每一個(gè)頁(yè)中包含了兩對(duì) header/trailer:內(nèi)部的 Page Header/Page Directory 關(guān)心的是頁(yè)的狀態(tài)信息,而 Fil Header/Fil Trailer 關(guān)心的是記錄頁(yè)的頭信息。
在頁(yè)的頭部和尾部之間就是用戶記錄和空閑空間了,每一個(gè)數(shù)據(jù)頁(yè)中都包含 Infimum 和 Supremum 這兩個(gè)虛擬的記錄(可以理解為占位符),Infimum 記錄是比該頁(yè)中任何主鍵值都要小的值,Supremum 是該頁(yè)中的最大值:
User Records 就是整個(gè)頁(yè)面中真正用于存放行記錄的部分,而 Free Space 就是空余空間了,它是一個(gè)鏈表的數(shù)據(jù)結(jié)構(gòu),為了保證插入和刪除的效率,整個(gè)頁(yè)面并不會(huì)按照主鍵順序?qū)λ杏涗涍M(jìn)行排序,它會(huì)自動(dòng)從左側(cè)向右尋找空白節(jié)點(diǎn)進(jìn)行插入,行記錄在物理存儲(chǔ)上并不是按照順序的,它們之間的順序是由 next_record 這一指針控制的。
B+ 樹在查找對(duì)應(yīng)的記錄時(shí),并不會(huì)直接從樹中找出對(duì)應(yīng)的行記錄,它只能獲取記錄所在的頁(yè),將整個(gè)頁(yè)加載到內(nèi)存中,再通過(guò) Page Directory 中存儲(chǔ)的稀疏索引和 n_owned、next_record 屬性取出對(duì)應(yīng)的記錄,不過(guò)因?yàn)檫@一操作是在內(nèi)存中進(jìn)行的,所以通常會(huì)忽略這部分查找的耗時(shí)。
InnoDB 存儲(chǔ)引擎中對(duì)數(shù)據(jù)的存儲(chǔ)是一個(gè)非常復(fù)雜的話題,這一節(jié)中也只是對(duì)表、行記錄以及頁(yè)面的存儲(chǔ)進(jìn)行一定的分析和介紹,雖然作者相信這部分知識(shí)對(duì)于大部分開發(fā)者已經(jīng)足夠了,但是想要真正消化這部分內(nèi)容還需要很多的努力和實(shí)踐。
Java程序員福利:我把2019近一年經(jīng)歷過(guò)的Java崗位面試,和一些刷過(guò)的面試題都做成了PDF,PDF都是可以免費(fèi)分享給大家的,關(guān)注私信我:【101】,免費(fèi)領(lǐng)取!
總結(jié)
以上是生活随笔為你收集整理的mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python单击url下载网页文件_使用
- 下一篇: eclipse连接mysql_专题一、f