版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫(kù)程序員面試分類真題25簡(jiǎn)答題1.
在MySQL中,如何查看表的詳細(xì)信息,例如,存儲(chǔ)引擎、行數(shù)、更新時(shí)間等?正確答案:可以使用SHOWTABLESTATUS獲取表的詳細(xì)信息,語法為
(江南博哥)SHOWTABLESTATUS
[{FROM|IN}db_name]
[LIKE'pattern'|WHEREexpr]
例如:
(1)showtablestatusfromdb_name查詢db_name數(shù)據(jù)庫(kù)里所有表的信息
(2)showtablestatusfromdb_namelike'lhruse'\G;查詢db_name里lhruse表的信息
(3)showtablestatusfromdb_namelike'uc%'查詢db_name數(shù)據(jù)庫(kù)里表名以u(píng)c開頭的表的信息
下面的SQL語句查詢了mysql數(shù)據(jù)庫(kù)中的user表的詳細(xì)信息:
其中,每列的含義見下表。列名解釋Name表名Engine表的存儲(chǔ)引擎,在MySQL4.1.2之前,該列的名字為TypeVersion表的.frm文件的版本號(hào)Row_format行存儲(chǔ)格式(Fixed,Dynamic,Compressed,Redundant,Compact)。對(duì)于MyISAM引擎,可以是Dynalmc、Fixed或Compressed。動(dòng)態(tài)行的行長(zhǎng)度可變,例如Varchar或Blob類型字段。固定行是指行長(zhǎng)度不變,例如Char和Integer類型字段Rows行的數(shù)目。對(duì)于非事務(wù)性表,這個(gè)值是精確的,對(duì)于事務(wù)性引擎,這個(gè)值通常是估算的。例如MyISAM,存儲(chǔ)精確的數(shù)目。對(duì)于其他存儲(chǔ)引擎,比如InnoDB,本值是一個(gè)大約的數(shù),與實(shí)際值相差可達(dá)40~50%。在這些情況下,使用SELECTCOUNT(*)來獲得準(zhǔn)確的數(shù)目。對(duì)于在INFORMATION_SCHEMA數(shù)據(jù)庫(kù)中的表,Rows值為NULLAvg_row_length平均每行包括的字節(jié)數(shù)Data_length表數(shù)據(jù)的大小(和存儲(chǔ)引擎有關(guān))Max_data_length表可以容納的最大數(shù)據(jù)量(和存儲(chǔ)引擎有關(guān))Index_length索引的大小(和存儲(chǔ)引擎有關(guān))Data_free對(duì)于MyISAM引擎,標(biāo)識(shí)已分配,但現(xiàn)在未使用的空間,并且包含了已被刪除行的空間Auto_increment下一個(gè)Auto_increment的值Create_time表的創(chuàng)建時(shí)間Update_time表的最近更新時(shí)間Check_time使用checktable或myisamchk工具檢查表的最近時(shí)間Collation表的默認(rèn)字符集和字符排序規(guī)則Checksum如果啟用,則對(duì)整個(gè)表的內(nèi)容計(jì)算時(shí)的校驗(yàn)和Create_options指表創(chuàng)建時(shí)的其他所有選項(xiàng)Comment包含了其他額外信息,對(duì)于MyISAM引擎,包含了注釋。對(duì)于InnoDB引擎,則保存著InnoDB表空間的剩余空間信息。如果是一個(gè)視圖,那么注釋里面包含了VIEW字樣
也可以使用information_schema.tables表來查詢,如下:
SELECTtable_name,Engine,Version,Row_format,table_rows,Avg_row_length,
Data_length,Max_data_length,Index_length,Data_free,Auto_increment,
Create_time,Update_time,Check_time,table_collation,Checksum,
Create_options,table_comment
FROMinformation_schema.tables
WHERETable_Sehema='mysql'andtable_name='user\G;
2.
MySQL的企業(yè)版和社區(qū)版的區(qū)別有哪些?正確答案:用戶通??梢缘焦俜骄W(wǎng)站下載最新版本的MySQL數(shù)據(jù)庫(kù)。按照用戶群分類,MySQL數(shù)據(jù)庫(kù)目前分為社區(qū)版(CommunityServer)和企業(yè)版(Enterprise),它們最重要的區(qū)別在于:社區(qū)版是自由下載而且完全免費(fèi)的,但是官方不提供任何技術(shù)支持,適用于大多數(shù)普通用戶;企業(yè)版是收費(fèi)的,不能在線下載,但是,它提供了更多的功能和更完備的技術(shù)支持,更適合于對(duì)數(shù)據(jù)庫(kù)的功能和可靠性要求較高的企業(yè)客戶。[考點(diǎn)]維護(hù)
3.
在Linux下安裝MySQL有哪幾種方式?它們的優(yōu)缺點(diǎn)各有哪些?正確答案:在Windows下可以使用NOINSTALL包和圖形化包來安裝,在Linux下可以使用如下3種方式來安裝:
[考點(diǎn)]維護(hù)
4.
如何查看和修改系統(tǒng)參數(shù)?正確答案:在MySQL里,參數(shù)也可以叫變量(Variables),一般配置文件為/etc/f。當(dāng)MySQL實(shí)例啟動(dòng)時(shí),MySQL會(huì)先去讀一個(gè)配置參數(shù)文件,用來尋找數(shù)據(jù)庫(kù)的各種文件所在位置以及指定某些初始化參數(shù),這些參數(shù)通常定義了某種內(nèi)存結(jié)構(gòu)有多大等設(shè)置。默認(rèn)情況下,MySQL實(shí)例會(huì)按照一定的次序去讀取所有參數(shù)文件,可以通過命令“mysql--help|grepf”來查找這些參數(shù)文件的位置。
在Linux下的次序?yàn)?etc/f->/etc/mysql/f->/usr/local/mysql/etc/f->~/.f;在Windows下的次序?yàn)镃:\WINDOWS\my.ini->C:\WINDOWS\f->C:\my.ini->C:\f->%MySQL安裝目錄%\my.ini->%MySQL安裝目錄%\f。如果這幾個(gè)配置文件中都有同一個(gè)參數(shù),那么MySQL數(shù)據(jù)庫(kù)會(huì)以讀取到的最后一個(gè)配置文件中的參數(shù)為準(zhǔn)。在Linux環(huán)境下,配置文件一般為/etc/f。在數(shù)據(jù)庫(kù)啟動(dòng)的時(shí)候可以加上從指定參數(shù)文件進(jìn)行啟動(dòng),如下:
mysqld_safe--defaults-file=/etc/f&
MySQL的變量可以分為系統(tǒng)變量和狀態(tài)變量。MySQL沒有類似于Oracle的隱含參數(shù),也不需要隱含參數(shù)來設(shè)置。下面分別講解。
1.系統(tǒng)變量
系統(tǒng)變量用于配置MySQL服務(wù)器的運(yùn)行環(huán)境。系統(tǒng)變量按其作用域的不同可以分為兩種:①全局(GLOBAL)級(jí),對(duì)整個(gè)MySQL服務(wù)器有效;②會(huì)話(SESSION或LOCAL)級(jí),只影響當(dāng)前會(huì)話。有些變量同時(shí)擁有以上兩個(gè)級(jí)別,MySQL將在建立連接時(shí)用全局級(jí)變量初始化會(huì)話級(jí)變量,但一旦連接建立之后,全局級(jí)變量的改變不會(huì)影響到會(huì)話級(jí)變量??梢杂胹howvariables查看系統(tǒng)變量的值,如下:
mysql>showvariableslike'log%';
mysql>showvariableswhereVariable_namelike'log%'andvalue='ON';
注意:showvariables優(yōu)先顯示會(huì)話級(jí)變量的值,若這個(gè)值不存在,則顯示全局級(jí)變量的值,當(dāng)然也可以加上GLOBAL或SESSION關(guān)鍵字進(jìn)行區(qū)別:
showglobalvariables;
showsession/localvariables;
在寫一些存儲(chǔ)過程時(shí),可能需要引用系統(tǒng)變量的值,可以使用如下方法:
@@GLOBAL.var_name
@@SESSION.var_name
@@LOCAL.var_name
如果在變量名前沒有級(jí)別限定符,那么將優(yōu)先顯示會(huì)話級(jí)的值。
另外一種查看系統(tǒng)變量值的方法是直接查詢表。對(duì)于MySQL5.6可以從INFORMATION_SCHEMA.GLOBAL_VARIABLES和INFORMATION_SCHEMA.SESSION_VARIABLES表獲得;對(duì)于MySQL5.7可以從performance_schema.global_variables和performance_schema.session_variables表中查詢。需要注意的是,若要查詢INFORMATION_SCHEMA.GLOBAL_VARIABLES或INFORMATION_SCHEMA.SESSION_VARIABLES表,則需要設(shè)置參數(shù)show_compatibility_56的值為ON,否則會(huì)報(bào)錯(cuò):ERROR3167(HY000):The'INFORMATION_SCHEMA.GLOBAL_STATUS'featureisdisabled;seethedocumentationfor'show_compatibility_56'。
在MySQL服務(wù)器啟動(dòng)時(shí),可以通過以下兩種方法設(shè)置系統(tǒng)變量的值:
1)命令行參數(shù),例如,mysqld--max_connections=200。
2)選項(xiàng)文件(f)。在MySQL服務(wù)器啟動(dòng)后,如果需要修改系統(tǒng)變量的值,那么可以通過SET語句:
SETGLOBALvar_name=value;
SET@@GLOBAL.var_name=value;
SETSESSIONvar_name=value;
SET@@SESSION.var_name=value;
如果在變量名前沒有級(jí)別限定符,那么表示修改會(huì)話級(jí)變量。
MySQL的系統(tǒng)變量也可以分為動(dòng)態(tài)(Dynamic)系統(tǒng)變量和靜態(tài)(Static)系統(tǒng)變量。動(dòng)態(tài)系統(tǒng)變量意味著可以在MySQL實(shí)例運(yùn)行中進(jìn)行更改;靜態(tài)系統(tǒng)變量說明在整個(gè)實(shí)例生命周期內(nèi)都不得進(jìn)行更改,就好像是只讀(ReadOnly)的。
注意:和啟動(dòng)時(shí)不一樣的是,在運(yùn)行時(shí)設(shè)置的變量不允許使用后綴字母'K'、'M'等,但可以用表達(dá)式來達(dá)到相同的效果,如:
SETGLOBALread_buffer_size=2*1024*1024
2.狀態(tài)變量
狀態(tài)變量用于監(jiān)控MySQL服務(wù)器的運(yùn)行狀態(tài),可以用showstares查看。狀態(tài)變量和系統(tǒng)變量類似,也分為全局級(jí)和會(huì)話級(jí),showstatus也支持like匹配查詢,不同之處在于,狀態(tài)變量只能由MySQL服務(wù)器本身設(shè)置和修改,對(duì)于用戶來說是只讀的,不可以通過SET語句設(shè)置和修改它們。另外,和系統(tǒng)變量類似,也可以通過表的方式來查詢狀態(tài)變量的值,MySQL5.6查詢INFORMATION_SCHEMA.GLOBAL_STATUS和INFORMATION_SCHEMA.SESSION_STATUS;MySQL5.7查詢performance_schema.session_status和performance_schema.session_status。[考點(diǎn)]參數(shù)
5.
MySQL查看當(dāng)前使用的配置文件f的方法有哪些?正確答案:MySQL實(shí)例在啟動(dòng)時(shí),會(huì)先讀取配置參數(shù)文件f一般會(huì)放在MySQL的安裝目錄中,用戶也可以放在其他目錄加載。在安裝MySQL后,系統(tǒng)中會(huì)有多個(gè)f文件,有些是用于測(cè)試的。使用“l(fā)ocatef”或“find/-namef”命令可以列出所有的f文件。
有時(shí)候,DBA會(huì)發(fā)現(xiàn)雖然嘗試修改了配置文件的一些變量,但是并沒有生效,這其實(shí)是因?yàn)樾薷牡奈募⒎荕ySQL服務(wù)器讀取的配置文件。在Linux環(huán)境中,MySQL服務(wù)器讀取的配置文件及路徑默認(rèn)為
/etc/my.enf
/etc/mysql/f
/usr/etc/my.enf
~/.f
如果不清楚MySQL當(dāng)前使用的配置文件路徑,那么可以按照如下步驟來查看:
(1)查看是否使用了指定目錄的f文件
在啟動(dòng)MySQL后,可以通過查看MySQL的進(jìn)程,看是否有設(shè)置使用指定目錄的f文件,如果有則表示MySQL啟動(dòng)時(shí)加載了這個(gè)配置文件。
命令:ps-ef|grepmysql|grep'f'
如果上面的命令沒有輸出,那么表示沒有設(shè)置使用指定目錄的f,若有輸出則表示使用的是輸出中的文件。
(2)查看MySQL默認(rèn)讀取f的目錄
如果沒有設(shè)置使用指定目錄的f,MySQL啟動(dòng)時(shí)會(huì)讀取安裝目錄根目錄及默認(rèn)目錄下的f文件。
命令:mysql--help|grep'f'或mysqld--verbose--help|grep-A1'Defaultoptions'
一般情況下,“/etc/f、/etc/mysql/f、/usr/local/etc/f、~/.f”就是MySQL默認(rèn)會(huì)搜尋f的目錄,順序排前的優(yōu)先。
(3)啟動(dòng)時(shí)沒有使用配置文件
如果沒有設(shè)置使用指定目錄f文件及默認(rèn)讀取目錄沒有f文件,那么表示MySQL啟動(dòng)時(shí)并沒有加載配置文件,而是使用默認(rèn)配置。若需要修改配置,則可以在MySQL默認(rèn)讀取的目錄中,創(chuàng)建一個(gè)f文件(例如,/etc/f),把需要修改的配置內(nèi)容寫入,重啟MySQL后即可生效。
如果是Windows安裝版,那么找到相關(guān)的Windows服務(wù),會(huì)看到配置了一個(gè)文件地址,如下圖所示。
若此處沒有看到配置文件地址,則使用的是默認(rèn)目錄下的f文件。[考點(diǎn)]參數(shù)
6.
MySQL有哪幾類物理文件?正確答案:MySQL數(shù)據(jù)庫(kù)的文件包括:
1)參數(shù)文件:f。
2)日志文件:包括錯(cuò)誤日志、查詢?nèi)罩?、慢查詢?nèi)罩竞投M(jìn)制日志。
3)MySQL表文件:用來存放MySQL表結(jié)構(gòu)的文件,一般以.frm為后綴。
4)Socket文件:當(dāng)用Unix域套接字方式進(jìn)行連接時(shí)需要的文件。
5)Pid文件:MySQL實(shí)例的進(jìn)程ID文件。
6)存儲(chǔ)引擎文件:每個(gè)存儲(chǔ)引擎都有自己的文件夾來保存各種數(shù)據(jù),這些存儲(chǔ)引擎真正存儲(chǔ)了數(shù)據(jù)和索引等數(shù)據(jù)。[考點(diǎn)]文件
7.
什么是MySQL的套接字文件?正確答案:MySQL有兩種連接方式,常用的是TCP/IP方式,如下:
mysql-h59-uroot-plhr
還有一種是套接字方式。Unix系統(tǒng)下本地連接MySQL可以采用Unix套接字方式,這種方式需要一個(gè)套接字(Socket)文件。套接字文件就是當(dāng)用套接字方式進(jìn)行連接時(shí)需要的文件。套接字方式比用TCP/IP的方式更快,更安全,但只適用于MySQL和客戶端在同一臺(tái)PC上。套接字文件可由參數(shù)socket控制,一般在/tmp目錄下,名為mysql.sock,也可以放在其他目錄下,如下:
用套接字連接MySQL:
mysql-plhr-S/var/lib/mysq157/mysql.sock[考點(diǎn)]文件
8.
什么是MySQL的pid文件?正確答案:pid文件是MySQL實(shí)例的進(jìn)程ID文件。當(dāng)MySQL實(shí)例啟動(dòng)時(shí),會(huì)將自己的進(jìn)程ID寫入一個(gè)文件中,該文件即為pid文件。該文件可由參數(shù)pid_file控制,默認(rèn)路徑位于數(shù)據(jù)庫(kù)目錄下,文件名為主機(jī)名.pid,如下:
[考點(diǎn)]文件
9.
MySQL支持事務(wù)嗎?正確答案:在缺省模式下,MySQL是AUTOCOMMIT模式的,所有的數(shù)據(jù)庫(kù)更新操作都會(huì)即時(shí)提交。這就表示除非顯式地開始一個(gè)事務(wù),否則每個(gè)查詢都被當(dāng)作一個(gè)單獨(dú)的事務(wù)自動(dòng)執(zhí)行。但是,如果MySQL表類型是使用InnoDBTables(或其他支持事務(wù)的存儲(chǔ)引擎),那么MySQL就可以使用事務(wù)處理,使用SETAUTOCOMMIT=0就可以使MySQL運(yùn)行在非AUTOCOMMIT模式下。在非AUTOCOMMIT模式下,必須使用COMMIT來提交更改,或者使用ROLLBACK來回滾更改。需要注意的是,在MySQL5.5以前,默認(rèn)的存儲(chǔ)引擎是MyISA2M(從MySQL5.5開始,默認(rèn)存儲(chǔ)引擎是InnoDB),而MyISAM存儲(chǔ)引擎不支持事務(wù)處理,所以改變AUTOCOMMIT的值對(duì)數(shù)據(jù)庫(kù)沒有什么作用,但不會(huì)報(bào)錯(cuò)。所以,若要使用事務(wù)處理,則一定要確定所操作的表是支持事務(wù)處理的,如InnoDB。如果不知道表的存儲(chǔ)引擎,那么可以通過查看建表語句來確定表的存儲(chǔ)引擎。[考點(diǎn)]存儲(chǔ)引擎
10.
InnoDB存儲(chǔ)引擎支持哪些事務(wù)類型?正確答案:對(duì)于InnoDB存儲(chǔ)引擎來說,其支持扁平事務(wù)、帶有保存點(diǎn)的扁平事務(wù)、鏈?zhǔn)聞?wù)和分布式事務(wù)。對(duì)于嵌套事務(wù),其原生不支持。因此對(duì)有并發(fā)事務(wù)需求的用戶來說,MySQL數(shù)據(jù)庫(kù)或InnoDB存儲(chǔ)引擎就顯得無能為力,然而用戶仍可以通過帶保存點(diǎn)的事務(wù)來模擬串行的嵌套事務(wù)。[考點(diǎn)]存儲(chǔ)引擎
11.
InnoDB存儲(chǔ)引擎支持XA事務(wù)嗎?正確答案:XA事務(wù)即分布式事務(wù),目前在MySQL的存儲(chǔ)引擎中,只有InnoDB存儲(chǔ)引擎才支持XA事務(wù)。需要注意的是,在使用分布式事務(wù)時(shí),InnoDB存儲(chǔ)引擎的隔離級(jí)別必須設(shè)置為SERIALIZABLE。通過參數(shù)innodb_support_xa可以查看是否啟用了XA事務(wù)的支持(默認(rèn)為ON,表示啟用):
[考點(diǎn)]存儲(chǔ)引擎
12.
MySQL中的XA事務(wù)分為哪幾類?正確答案:MySQL從5.0.3版本開始支持XA事務(wù),即分布式事務(wù)。在MySQL中,XA事務(wù)有兩種,內(nèi)部XA事務(wù)和外部XA事務(wù),下面分別介紹。
(1)內(nèi)部XA事務(wù)
MySQL本身的插件式架構(gòu)導(dǎo)致在其內(nèi)部需要使用XA事務(wù),此時(shí)MySQL既是協(xié)調(diào)者,也是參與者。內(nèi)部XA事務(wù)發(fā)生在存儲(chǔ)引擎與插件之間,或者存儲(chǔ)引擎與存儲(chǔ)引擎之間。例如,不同的存儲(chǔ)引擎之間是完全獨(dú)立的,因此當(dāng)一個(gè)事務(wù)涉及兩個(gè)不同的存儲(chǔ)引擎時(shí),就必須使用內(nèi)部XA事務(wù)。由于只在單機(jī)上工作,所以被稱為內(nèi)部XA。
最為常見的內(nèi)部xA事務(wù)存在于二進(jìn)制日志(Binlog)和InnoDB存儲(chǔ)引擎之間。由于復(fù)制的需要,目前絕大多數(shù)的數(shù)據(jù)庫(kù)都開啟了Binlog功能。在事務(wù)提交時(shí),先寫二進(jìn)制日志,再寫InnoDB存儲(chǔ)引擎的重做日志。對(duì)上述兩個(gè)操作的要求也是原子的,即二進(jìn)制日志和重做日志必須同時(shí)寫入。若二進(jìn)制日志先寫了,而在寫入InnoDB存儲(chǔ)引擎時(shí)發(fā)生了宕機(jī),那么Slave可能會(huì)接收到Master傳過去的二進(jìn)制日志并執(zhí)行,最終導(dǎo)致了主從不一致的情況。為了解決這個(gè)問題,MySQL數(shù)據(jù)庫(kù)在Binlog與InnoDB存儲(chǔ)引擎之間采用XA事務(wù)。當(dāng)事務(wù)提交時(shí),InnoDB存儲(chǔ)引擎會(huì)先做一個(gè)PREPARE操作,將事務(wù)的Xid寫入,接著進(jìn)行Binlog的寫入。如果在Binlog存儲(chǔ)引擎提交前,MYSQL數(shù)據(jù)庫(kù)宕機(jī)了,那么MySQL數(shù)據(jù)庫(kù)在重啟后會(huì)先檢查準(zhǔn)備的UXID事務(wù)是否已經(jīng)提交,若沒有,則在存儲(chǔ)引擎層再進(jìn)行一次提交操作。
(2)外部XA事務(wù)
外部XA事務(wù)就是一般談?wù)摰姆植际绞聞?wù)。MySQL支持XASTART/END/PREPARE/COMMIT這些SQL語句,通過使用這些命令可以完成分布式事務(wù)的狀態(tài)轉(zhuǎn)移。MySQL在執(zhí)行分布式事務(wù)(外部XA)的時(shí)候,MySQL服務(wù)器相當(dāng)于XA事務(wù)資源管理器,與MySQL鏈接的客戶端相當(dāng)于事務(wù)管理器。
內(nèi)部:XA事務(wù)用于同一實(shí)例下跨多引擎事務(wù),而外部XA事務(wù)用于跨多MySQL實(shí)例的分布式事務(wù),需要應(yīng)用層作為協(xié)調(diào)者。應(yīng)用層負(fù)責(zé)決定提交還是回滾。MySQL數(shù)據(jù)庫(kù)外部XA事務(wù)可以用在分布式數(shù)據(jù)庫(kù)代理層,實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)的分布式事務(wù)支持,例如開源的代理工具:網(wǎng)易的DDB、淘寶的TDDL等。[考點(diǎn)]存儲(chǔ)引擎
13.
什么是MySQL的存儲(chǔ)引擎?正確答案:MySQL中的數(shù)據(jù)用各種不同的技術(shù)存儲(chǔ)在文件(或者內(nèi)存)中。這些技術(shù)中的每一種都使用不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平并且最終提供廣泛的不同的功能。通過選擇不同的技術(shù),能夠獲得額外的速度或者功能,從而改善應(yīng)用的整體功能。例如,研究大量的臨時(shí)數(shù)據(jù),也許需要使用內(nèi)存存儲(chǔ)引擎。內(nèi)存存儲(chǔ)引擎能夠在內(nèi)存中存儲(chǔ)所有的表格數(shù)據(jù)。這些不同的技術(shù)以及配套的相關(guān)功能在MySQL中被稱作存儲(chǔ)引擎(StorageEngines,也稱作表類型)。MySQL默認(rèn)配置了許多不同的存儲(chǔ)引擎,可以預(yù)先設(shè)置或者在MySQL服務(wù)器中啟用。[考點(diǎn)]存儲(chǔ)引擎
14.
MySQL有幾種存儲(chǔ)引擎(表類型)?各自有什么區(qū)別?正確答案:MySQL官方有多種存儲(chǔ)引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。第三方存儲(chǔ)引擎中比較有名的有TokuDB、Infobright、InnfiniDB、XtraDB(InnoDB增強(qiáng)版本)。其中,最常見的兩種存儲(chǔ)引擎是MyISAM和InnoDB。MyISAM是MySQL關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)的默認(rèn)存儲(chǔ)引擎(MySQL5.5以前)。這種MySQL表存儲(chǔ)結(jié)構(gòu)從舊ISAM代碼擴(kuò)展出許多有用的功能。從MySQL5.5開始,InnoDB引擎由于其對(duì)事務(wù)參照完整性,以及更高的并發(fā)性等優(yōu)點(diǎn)開始逐步地取代MyISAM,作為MySQL數(shù)據(jù)庫(kù)的默認(rèn)存儲(chǔ)引擎。下面逐一介紹各種存儲(chǔ)引擎。
1.MyISAM
MyISAM存儲(chǔ)引擎管理非事務(wù)表,提供高速存儲(chǔ)和檢索,以及全文搜索能力。該引擎插入數(shù)據(jù)快,空間和內(nèi)存使用比較低。
(1)存儲(chǔ)組成
每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件。每一個(gè)文件的名字就是表的名字,文件名都和表名相同,擴(kuò)展名指出了文件類型。這里特別要注意的是,MyISAM不緩存數(shù)據(jù)文件,只緩存索引文件。
1)表定義的擴(kuò)展名為.frm(frame,存儲(chǔ)表定義)。
2)數(shù)據(jù)文件的擴(kuò)展名為.MYD(MYData,存儲(chǔ)數(shù)據(jù))。
3)索引文件的擴(kuò)展名是.MYI(MYIndex,存儲(chǔ)索引)。
數(shù)據(jù)文件和索引文件可以放置在不同的目錄,平均分布I/O,獲得更快的速度,而且其索引是壓縮的,能加載更多索引,這樣內(nèi)存使用率就對(duì)應(yīng)提高了不少,壓縮后的索引也能節(jié)約一些磁盤空間。
(2)特點(diǎn)
1)不支持事務(wù),不支持外鍵約束,但支持全文索引,這可以極大地優(yōu)化LIKE查詢的效率。
2)表級(jí)鎖定(更新時(shí)鎖定整個(gè)表):其鎖定機(jī)制是表級(jí)索引,這雖然可以讓鎖定的實(shí)現(xiàn)成本很小,但是也同時(shí)大大降低了其并發(fā)性能。MyISAM不支持行級(jí)鎖,只支持并發(fā)插入的表鎖,主要用于高負(fù)載的查詢。
3)讀寫互相阻塞:不僅會(huì)在寫入的時(shí)候阻塞讀取,MyISAM還會(huì)在讀取的時(shí)候阻塞寫入,但讀本身并不會(huì)阻塞另外的讀。
4)不緩存數(shù)據(jù),只緩存索引:MyISAM可以通過key_buffer緩存,以大大提高訪問性能,減少磁盤I/O,但是這個(gè)緩存區(qū)只會(huì)緩存索引,而不會(huì)緩存數(shù)據(jù)。
[root@mysql]#grepkey_bufferf
key_buffer_size=16M
5)讀取速度較快,占用資源相對(duì)少。
6)MyISAM引擎是MySQL5.5之前版本缺省的存儲(chǔ)引擎。
7)并發(fā)量較小,不適合大量UPDATE。
(3)適用場(chǎng)景
如果表主要用于插入新記錄和讀出新記錄,那么選擇MyISAM存儲(chǔ)引擎能實(shí)現(xiàn)處理的高效率。如果應(yīng)用的完整性和并發(fā)性要求很低,那么也可以選擇MyISAM存儲(chǔ)引擎。它是在Web、數(shù)據(jù)倉(cāng)儲(chǔ)和其他應(yīng)用環(huán)境下最常使用的存儲(chǔ)引擎之一。具體來說,適用于以下場(chǎng)景:
1)不需要事務(wù)支持的業(yè)務(wù),一般為讀數(shù)據(jù)比較多的網(wǎng)站應(yīng)用。
2)并發(fā)相對(duì)較低的業(yè)務(wù)(純讀純寫高并發(fā)也可以)。
3)數(shù)據(jù)修改相對(duì)較少的業(yè)務(wù)。
4)以讀為主的業(yè)務(wù),例如,WWW、BLOG、圖片信息數(shù)據(jù)庫(kù)、用戶數(shù)據(jù)庫(kù)、商品數(shù)據(jù)庫(kù)等業(yè)務(wù)。
5)對(duì)數(shù)據(jù)一致性要求不是非常高的業(yè)務(wù)。
6)中小型網(wǎng)站的部分業(yè)務(wù)。
小結(jié):?jiǎn)我粚?duì)數(shù)據(jù)庫(kù)的操作都可以使用MyISAM,所謂單一就是盡量純讀,或純寫(INSERT,UPDATE,DELETE)等。生產(chǎn)建議:沒有特別需求,一律用InnoDB。
(4)MyISAM引擎調(diào)優(yōu)精要
1)盡量索引(緩存機(jī)制)。
2)調(diào)整讀寫優(yōu)先級(jí),根據(jù)實(shí)際需要確保重要操作更優(yōu)先。
3)啟用延遲插入改善大批量寫入性能(降低寫入頻率,盡可能多條數(shù)據(jù)一次性寫入)。
4)盡量順序操作讓INSERT數(shù)據(jù)都寫入尾部,減少阻塞。
5)分解大的操作,降低單個(gè)操作的阻塞時(shí)間。
6)降低并發(fā)數(shù),某些高并發(fā)場(chǎng)景通過應(yīng)用進(jìn)行排隊(duì)機(jī)制。
7)對(duì)于相對(duì)靜態(tài)的數(shù)據(jù),充分利用QueryCache可以極大地提高訪問效率。
[root@mysql3307]#grepqueryf
query_cache_size=2M
query_cache_limit=1M
query_cache_min_res_unit=2k
這幾個(gè)參數(shù)都是MySQL自身緩存設(shè)置。
8)MyISAM的COUNT只有在全表掃描的時(shí)候特別高效,帶有其他條件的COUNT都需要進(jìn)行實(shí)際的數(shù)據(jù)訪問。
9)把主從同步的主庫(kù)使用InnoDB,從庫(kù)使用MyISAM引擎。
2.InnoDB
InnoDB用于事務(wù)處理應(yīng)用程序,主要面向OLTP方面的應(yīng)用。該引擎由InnoDB公司開發(fā),其特點(diǎn)是行鎖設(shè)置,并支持類似于Oracle的非鎖定讀,即默認(rèn)情況下讀不產(chǎn)生鎖。InnoDB將數(shù)據(jù)放在一個(gè)邏輯表空間中。InnoDB通過多版本并發(fā)控制來獲得高并發(fā)性,實(shí)現(xiàn)了ANSI標(biāo)準(zhǔn)的4種隔離級(jí)別,默認(rèn)為Repeatable,使用一種被稱為next-keylocking的策略避免幻讀。對(duì)于表中數(shù)據(jù)的存儲(chǔ),InnoDB采用類似Oracle索引組織表Clustered的方式進(jìn)行存儲(chǔ)。如果對(duì)事務(wù)的完整性要求比較高,要求實(shí)現(xiàn)并發(fā)控制,那么選擇InnoDB引擎有很大的優(yōu)勢(shì)。需要頻繁地進(jìn)行更新,刪除操作的數(shù)據(jù)庫(kù),也可以選擇InnoDB存儲(chǔ)引擎。因?yàn)镮nnoDB存儲(chǔ)引擎提供了具有提交(COMMIT)、回滾(ROLLBACK)和崩潰恢復(fù)能力的事務(wù)安全。
InnoDB類型的表只有ibd文件,分為數(shù)據(jù)區(qū)和索引區(qū),有較好的讀寫并發(fā)能力。物理文件有日志文件、數(shù)據(jù)文件和索引文件。其中,索引文件和數(shù)據(jù)文件是放在一個(gè)目錄下,可以設(shè)置共享文件、獨(dú)享文件兩種格式。
(1)特點(diǎn)
1)支持事務(wù):包括ACID事務(wù)支持,支持4個(gè)事務(wù)隔離級(jí)別,支持多版本讀。
2)行級(jí)鎖定(更新時(shí)一般是鎖定當(dāng)前行):通過索引實(shí)現(xiàn),全表掃描仍然會(huì)是表鎖,注意間隙鎖的影響。
3)支持崩潰修復(fù)能力和MVCC。
4)讀寫阻塞與事務(wù)隔離級(jí)別相關(guān)。
5)具有非常高效的緩存特性:能緩存索引,也能緩存數(shù)據(jù)。
6)整個(gè)表和主鍵以CLUSTER方式存儲(chǔ),組成一棵平衡樹。
7)所有SECONDARYINDEX都會(huì)保存主鍵信息。
8)支持分區(qū)、表空間,類似Oracle數(shù)據(jù)庫(kù)。
9)支持外鍵約束(ForeignKey),外鍵所在的表稱為子表,而所依賴的表稱為父表。
10)InnoDB支持自增長(zhǎng)列(AUTO_INCREMENT),自增長(zhǎng)列的值不能為空。
11)InnoDB是索引和數(shù)據(jù)緊密捆綁的,沒有使用壓縮,從而會(huì)造成InnoDB比MyISAM體積龐大得多。
(2)優(yōu)點(diǎn)
支持事務(wù),用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持,支持外鍵,同時(shí)支持崩潰修復(fù)能力和并發(fā)控制。并發(fā)量較大,適合大量UPDATE。
(3)缺點(diǎn)
對(duì)比MyISAM的存儲(chǔ)引擎,InnoDB寫的處理效率差一些,并且會(huì)占用更多的磁盤空間以保留數(shù)據(jù)和索引。相比MyISAM引擎,InnoDB引擎更消耗資源,速度沒有MyISAM引擎快。
(4)適用場(chǎng)景
如果對(duì)事務(wù)的完整性要求比較高,要求實(shí)現(xiàn)并發(fā)控制,那么選擇InnoDB引擎有很大的優(yōu)勢(shì)。需要頻繁地進(jìn)行更新,刪除操作的數(shù)據(jù)庫(kù),也可以選擇InnoDB存儲(chǔ)引擎。具體分類如下:
1)需要事務(wù)支持(具有較好的事務(wù)特性)。
2)行級(jí)鎖定對(duì)高并發(fā)有很好的適應(yīng)能力,但需要確保查詢是通過索引完成。
3)數(shù)據(jù)更新較為頻繁的場(chǎng)景,例如,BBS(BulletinBoardSystem,電子公告牌系統(tǒng))、SNS(SocialNetworkSite,社交網(wǎng))等。
4)數(shù)據(jù)一致性要求較高的業(yè)務(wù)。例如,充值、銀行轉(zhuǎn)賬等。
5)硬件設(shè)備內(nèi)存較大,可以利用InnoDB較好的緩存能力來提高內(nèi)存利用率,盡可能減少磁盤I/O。
物理數(shù)據(jù)文件:
[root@mysql3307]#11data/ibdatal
-rw-rw----1mysqlmysql134217728May1508:31data/ibdata1
6)相比MyISAM引擎,InnoDB引擎更消耗資源,速度沒有MyISAM引擎快。
(5)InnoDB引擎調(diào)優(yōu)精要
1)主鍵盡可能小,避免給SECONDARYINDEX帶來過大的空間負(fù)擔(dān)。
2)避免全表掃描,因?yàn)闀?huì)使用表鎖。
3)盡可能緩存所有的索引和數(shù)據(jù),提高響應(yīng)速度,減少磁盤I/O消耗。
4)在執(zhí)行大量插入操作的時(shí)候,盡量自己控制事務(wù)而不要使用AUTOCOMMIT自動(dòng)提交。有開關(guān)可以控制提交方式。
5)合理設(shè)置innodb_flush_log_at_trx_commit參數(shù)值,不要過度追求安全性。
6)避免主鍵更新,因?yàn)檫@會(huì)帶來大量的數(shù)據(jù)移動(dòng)。
3.MEMORY(HEAP)
MEMORY存儲(chǔ)引擎(之前稱為HEAP)提供“內(nèi)存中”的表。如果需要很快的讀寫速度,對(duì)數(shù)據(jù)的安全性要求較低,那么可選擇MEMORY存儲(chǔ)引擎。MEMORY存儲(chǔ)引擎對(duì)表大小有要求,不能建太大的表。所以,這類數(shù)據(jù)庫(kù)只適用相對(duì)較小的數(shù)據(jù)庫(kù)表。如果mysqld進(jìn)程發(fā)生異常,那么數(shù)據(jù)庫(kù)就會(huì)重啟或崩潰,數(shù)據(jù)就會(huì)丟失,因此,MEMORY存儲(chǔ)引擎中的表的生命周期很短,一般只使用一次,非常適合存儲(chǔ)臨時(shí)數(shù)據(jù)。
(1)特點(diǎn)
1)MEMORY存儲(chǔ)引擎將所有數(shù)據(jù)保存在內(nèi)存(RAM)中,在需要快速查找引用和其他類似數(shù)據(jù)的環(huán)境下,可提供極快的訪問速度。
2)每個(gè)基于MEMORY存儲(chǔ)引擎的表實(shí)際對(duì)應(yīng)一個(gè)磁盤文件,該文件的文件名和表名是相同的,類型為.frm。該文件只存儲(chǔ)表的結(jié)構(gòu),而其數(shù)據(jù)文件都是存儲(chǔ)在內(nèi)存中,這樣有利于對(duì)數(shù)據(jù)的快速處理,提高整個(gè)表的處理能力。
3)MEMORY存儲(chǔ)引擎默認(rèn)使用哈希(HASH)索引,其速度比使用B-Tree型要快,但安全性不高。如果希望使用B-Tree型,那么在創(chuàng)建的時(shí)候可以引用。
(2)適用場(chǎng)景
如果需要很快的讀寫速度,那么在需要快速查找引用和其他類似數(shù)據(jù)的環(huán)境下,對(duì)數(shù)據(jù)的安全性要求較低,可選擇MEMORY存儲(chǔ)引擎。
(3)優(yōu)點(diǎn)
將所有數(shù)據(jù)保存在內(nèi)存(RAM)中,默認(rèn)使用HASH索引,數(shù)據(jù)的處理速度快。
(4)缺點(diǎn)
不支持事務(wù),安全性不高;MEMORY存儲(chǔ)引擎對(duì)表大小有要求,不能建太大的表。
4.MERGE
MERGE存儲(chǔ)引擎允許將一組使用MyISAM存儲(chǔ)引擎的并且表結(jié)構(gòu)相同(即每張表的字段順序、字段名稱、字段類型、索引定義的順序及其定義的方式必須相同)的數(shù)據(jù)表合并為一個(gè)表,方便了數(shù)據(jù)的查詢。需要注意的是,使用MERGE“合并”起來的表結(jié)構(gòu)相同的表最好不要有主鍵,否則會(huì)出現(xiàn)這種情況:一共有兩個(gè)成員表,其主鍵在兩個(gè)表中存在相同情況,但是寫了一條按相同主鍵值查詢的SQL語句,這時(shí)只能查到UNION列表中第一個(gè)表中的數(shù)據(jù)。MERGE存儲(chǔ)引擎允許集合將被處理同樣的MyISAM表作為一個(gè)單獨(dú)的表。
適用場(chǎng)景:MERGE存儲(chǔ)引擎允許MySQLDBA或開發(fā)人員將一系列等同的MyISAM表以邏輯方式組合在一起,并作為1個(gè)對(duì)象引用它們。對(duì)于諸如數(shù)據(jù)倉(cāng)庫(kù)等,VLDB(VeryLargeDataBase,超大型數(shù)據(jù)庫(kù))環(huán)境十分適合。
優(yōu)點(diǎn):便于同時(shí)引用多個(gè)數(shù)據(jù)表而無須發(fā)出多條查詢。
缺點(diǎn):不支持事務(wù)。
5.BDB(BerkeleyDB)
BDB是事務(wù)型存儲(chǔ)引擎,支持COMMIT、ROLLBACK和其他事務(wù)特性,它由Sleepycat軟件公司()開發(fā)。BDB是一個(gè)高性能的嵌入式數(shù)據(jù)庫(kù)編程庫(kù)(引擎),它可以用來保存任意類型的鍵/值對(duì)(Key/ValuePair),而且可以為一個(gè)鍵保存多個(gè)數(shù)據(jù)。BDB可以支持?jǐn)?shù)干的并發(fā)線程同時(shí)操作數(shù)據(jù)庫(kù),支持最大256TB的數(shù)據(jù)。BDB存儲(chǔ)引擎處理事務(wù)安全的表,并以哈希為基礎(chǔ)的存儲(chǔ)系統(tǒng)。
適用場(chǎng)景:BDB存儲(chǔ)引擎適合快速地讀寫某些數(shù)據(jù),特別是不同KEY的數(shù)據(jù)。
優(yōu)點(diǎn):支持事務(wù)。
缺點(diǎn):在沒有索引的列上操作速度很慢。
6.EXAMPLE
EXAMPLE存儲(chǔ)引擎是一個(gè)“存根”引擎,可以用這個(gè)引擎創(chuàng)建表,但數(shù)據(jù)不能存儲(chǔ)在該引擎中。EXAMPLE存儲(chǔ)引擎可為快速創(chuàng)建定制的插件式存儲(chǔ)引擎提供幫助。
7.NDB
NDB存儲(chǔ)引擎是一個(gè)集群存儲(chǔ)引擎,是被MySQLCluster用來實(shí)現(xiàn)分割到多臺(tái)計(jì)算機(jī)上的表的存儲(chǔ)引擎,類似于Oracle的RAC,但它是ShareNothing的架構(gòu),因此,能提供更高級(jí)別的高可用性和可擴(kuò)展性。NDB的特點(diǎn)是數(shù)據(jù)全部放在內(nèi)存中,因此,通過主鍵查找非常快。它在MySQL-Max5.1二進(jìn)制分發(fā)版里提供。
(1)特性
1)分布式:分布式存儲(chǔ)引擎,可以由多個(gè)NDBCluster存儲(chǔ)引擎組成集群分別存放整體數(shù)據(jù)的一部分。
2)支持事務(wù):和InnoDB一樣,支持事務(wù)。
3)可與mysqld不在一臺(tái)主機(jī):可以和mysqld分開存在于獨(dú)立的主機(jī)上,然后通過網(wǎng)絡(luò)和mysqld通信交互。
4)內(nèi)存需求量巨大:新版本索引以及被索引的數(shù)據(jù)必須存放在內(nèi)存中,老版本所有數(shù)據(jù)和索引必須存在于內(nèi)存中。
(2)適用場(chǎng)景
1)具有非常高的并發(fā)需求。
2)對(duì)單個(gè)請(qǐng)求的響應(yīng)并不是非常嚴(yán)格。
3)查詢簡(jiǎn)單,過濾條件較為固定,每次請(qǐng)求數(shù)據(jù)量較少。
4)具有高性能查找要求的應(yīng)用程序,這類查找需求還要求具有最高的正常工作時(shí)間和可用性。
(3)優(yōu)點(diǎn)
1)分布式:分布式存儲(chǔ)引擎,可以由多個(gè)NDBCluster存儲(chǔ)引擎組成集群分別存放整體數(shù)據(jù)的一部分。
2)支持事務(wù):和InnoDB一樣,支持事務(wù)。
3)可與mysqld不在一臺(tái)主機(jī):可以和mysqld分開存在于獨(dú)立的主機(jī)上,然后通過網(wǎng)絡(luò)和mysqld通信交互。
(4)缺點(diǎn)
內(nèi)存需求量巨大:新版本索引以及被索引的數(shù)據(jù)必須存放在內(nèi)存中,老版本所有數(shù)據(jù)和索引必須存在于內(nèi)存中。它的連接操作是在MySQL數(shù)據(jù)庫(kù)層完成,不是在存儲(chǔ)引擎層完成的,這意味著,復(fù)雜的連接操作需要巨大的網(wǎng)絡(luò)開銷,查詢速度會(huì)很慢。
8.ARCHIVE
ARCHIVE存儲(chǔ)引擎只支持INSERT和SELECT操作,其設(shè)計(jì)的主要目的是提供高速的插入和壓縮功能。
適用場(chǎng)景:ARCHIVE非常適合存儲(chǔ)歸檔數(shù)據(jù),如日志信息。
優(yōu)點(diǎn):ARCHIVE存儲(chǔ)引擎被用來無索引地、非常小地覆蓋存儲(chǔ)的大量數(shù)據(jù)。為大量很少引用的歷史、歸檔或安全審計(jì)信息的存儲(chǔ)和檢索提供了完美的解決方案。
缺點(diǎn):不支持事務(wù),只支持INSERT和SELECT操作。
9.CSV
CSV存儲(chǔ)引擎把數(shù)據(jù)以逗號(hào)分隔的格式存儲(chǔ)在文本文件中。
10.BLACKHOLE
BLACKHOLE存儲(chǔ)引擎接收但不存儲(chǔ)數(shù)據(jù),并且檢索總是返回一個(gè)空集。用于臨時(shí)禁止對(duì)數(shù)據(jù)庫(kù)的應(yīng)用程序輸入。該存儲(chǔ)引擎支持事務(wù),而且支持MVCC的行級(jí)鎖,主要用于日志記錄或同步歸檔。
11.FEDERATED
FEDERATED存儲(chǔ)引擎不存放數(shù)據(jù),它至少指向一臺(tái)遠(yuǎn)程MySQL數(shù)據(jù)庫(kù)服務(wù)器上的表,該存儲(chǔ)引擎把數(shù)據(jù)存在遠(yuǎn)程數(shù)據(jù)庫(kù)中,非常類似于Oracle的透明網(wǎng)關(guān)。在MySQL5.1中,它只和MySQL一起工作,使用MySQLCClientAPI。在未來的分發(fā)版中,想要讓它使用其他驅(qū)動(dòng)器或客戶端連接方法連接到另外的數(shù)據(jù)源。該存儲(chǔ)引擎能夠?qū)⒍鄠€(gè)分離的MySQL服務(wù)器連接起來,從多個(gè)物理服務(wù)器創(chuàng)建一個(gè)邏輯數(shù)據(jù)庫(kù),十分適合于分布式環(huán)境或數(shù)據(jù)集市環(huán)境。
12.ISAM
最原始的存儲(chǔ)引擎就是ISAM,它管理著非事務(wù)性表,后來被MyISAM代替了,而且MyISAM是向后兼容的,因此可以忘記這個(gè)ISAM存儲(chǔ)引擎。
可以在MySQL中使用顯示引擎的命令得到一個(gè)可用引擎的列表,如下:
上面查詢結(jié)果顯示了可用的數(shù)據(jù)庫(kù)引擎的全部名單以及在當(dāng)前的數(shù)據(jù)庫(kù)服務(wù)器中是否支持這些引擎。
下面的表格列出了一些常見的比較重要的存儲(chǔ)引擎。
15.
如何設(shè)置MySQL的存儲(chǔ)引擎?正確答案:可以使用多種方法指定一個(gè)要使用的存儲(chǔ)引擎。如果想用一種能滿足大多數(shù)數(shù)據(jù)庫(kù)需求的存儲(chǔ)引擎,那么可以在MySQL的配置文件(f)中設(shè)置一個(gè)默認(rèn)的引擎類型(在[mysqld]組下,使用default-storage-engine=InnoDB),或者在啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)器時(shí),在命令行后面加上“--default-storage-engine”選項(xiàng)。
最直接的使用存儲(chǔ)引擎的方式是在創(chuàng)建表時(shí)指定存儲(chǔ)引擎的類型,例如:
CREATETABLEmytable(idint,titlechar(20))ENGINE=INNODB
還可以改變現(xiàn)有的表使用的存儲(chǔ)引擎,用以下語句:
ALTERTABLEmytableENGINE=MyISAM;
然而,當(dāng)用這種方式修改表類型的時(shí)候需要非常仔細(xì),因?yàn)閷?duì)不支持同樣的索引、字段類型或者表大小的一個(gè)類型進(jìn)行修改可能導(dǎo)致數(shù)據(jù)的丟失。[考點(diǎn)]存儲(chǔ)引擎
16.
MyISAM和InnoDB各有哪些特性?分別適用在怎樣的場(chǎng)景下?正確答案:MyISAM支持表鎖,不支持事務(wù),表損壞率較高,主要面向OLAP的應(yīng)用;MyISAM讀寫并發(fā)不如InnoDB,適用于以SELECT和INSERT為主的場(chǎng)景,且支持直接復(fù)制文件,用以備份數(shù)據(jù);只緩存索引文件,不緩存數(shù)據(jù)文件。InnoDB支持行鎖,支持事務(wù),CRASH后具有RECOVER機(jī)制,其設(shè)計(jì)目標(biāo)主要面向OLTP的應(yīng)用。
它們之間其他的區(qū)別可以參考下表。比較項(xiàng)目MyISAMInnoDB構(gòu)成上的區(qū)別每個(gè)存儲(chǔ)引擎類型為MyISAM的表在磁盤上存儲(chǔ)成3個(gè)文件:文件擴(kuò)展名為.frm(frame)的文件存儲(chǔ)了表定義;文件擴(kuò)展名為.MYD(MYData)的文件存儲(chǔ)了表數(shù)據(jù);文件擴(kuò)展名為MYI(MYIndex)的文件存儲(chǔ)了索引。數(shù)據(jù)文件和索引文件可以放置在不同的目錄下,平均分布I/O,以獲得更快的速度每個(gè)存儲(chǔ)引擎類型為InnoDB的表在磁盤上存儲(chǔ)成2個(gè)文件:.frm和ibd文件。.frm文件存儲(chǔ)了表定義。ibd文件分為數(shù)據(jù)區(qū)和索引區(qū),有較好的讀寫并發(fā)能力事務(wù)處理MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行速度比InnoDB類型更快,但是不提供事務(wù)支持InnoDB提供事務(wù)支持、外鍵等高級(jí)數(shù)據(jù)庫(kù)功能。InnoDB存儲(chǔ)引擎提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全。但是對(duì)比MyISAM的存儲(chǔ)引擎,InnoDB寫的處理效率差一些,并且會(huì)占用更多的磁盤空間以保留數(shù)據(jù)和索引適用場(chǎng)景如果執(zhí)行大量的SELECT,那么MyISAM是更好的選擇1)如果執(zhí)行大量的INSERT或UPDATE,那么出于性能方面的考慮,應(yīng)該使用InnoDB表2)當(dāng)執(zhí)行DELETEFROMtable時(shí),InnoDB不會(huì)重建表,而是一行一一行地刪除3)LOADTABLEFROMMASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用清空表MyISAM會(huì)重建表InnoDB是一行一行地刪除,效率非常慢對(duì)AUTO_INCREMENT列的操作1)MyISAM為INSERT和UPDATE操作自動(dòng)更新這一列。AUTO_INCREMENT值可用ALTERTABLE來重置2)對(duì)于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引如果為一個(gè)表指定AUTO_INCREMENT列,那么在數(shù)據(jù)字典里的InnoDB表句柄包含一個(gè)名為自動(dòng)增長(zhǎng)計(jì)數(shù)器的計(jì)數(shù)器,它被用在為該列賦新值,自動(dòng)增長(zhǎng)計(jì)數(shù)器僅被存儲(chǔ)在主內(nèi)存中,而不是存在磁盤上。InnoDB中必須包含只有該字段的索引表的行數(shù)當(dāng)執(zhí)行SQL語句“SELECTCOUNT(*)FROMTABLE”時(shí),MyISAM只是簡(jiǎn)單地讀出保存好的行數(shù),需要注意的是,當(dāng)COUNT(*)語句包含WHERE條件時(shí),MyISAM和InnoDB的操作是一樣的InnoDB中不保存表的具體行數(shù),也就是說,當(dāng)執(zhí)行SELECTCOUNT(*)FROMTABLE時(shí),InnoDB要掃描一遍整個(gè)表來計(jì)算行數(shù),所以,InnoDB在做COUNT運(yùn)算時(shí)相當(dāng)消耗CPU鎖表級(jí)鎖定(更新時(shí)鎖定整個(gè)表):其鎖定機(jī)制是表級(jí)索引,這雖然可以讓鎖定的實(shí)現(xiàn)成本很小,但是也同時(shí)大大降低了其并發(fā)性能。不支持行級(jí)鎖,只支持并發(fā)插入的表鎖,主要用于高負(fù)載的SELECT提供行鎖(LockingonRowLevel),提供與Oracle類型一致的不加鎖讀取(Non-lockingRead),另外,InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語句時(shí)MySQL不能確定要掃描的范圍,那么InnoDB表同樣會(huì)鎖全表,例如UPDATETABLET_TEST_LHRSETNUM=1WHERENAMELIKE"%LHR%"開發(fā)公司MySQL公司InnoDB公司是否默認(rèn)存儲(chǔ)引擎是(5.5.8以前)是(5.5.8及其以后)[考點(diǎn)]存儲(chǔ)引擎
17.
MySQLInnoDB引擎類型的表有哪兩類表空間模式?它們各有什么優(yōu)缺點(diǎn)?正確答案:InnoDB存儲(chǔ)表和索引有以下兩種方式:
1)使用共享表空間存儲(chǔ),這種方式創(chuàng)建的表的表結(jié)構(gòu)保存在.frm文件中。InnoDB的所有數(shù)據(jù)和索引保存在一個(gè)單獨(dú)的表空間(由參數(shù)innodb_data_home_dir和innodb_data_file_path定義,若innodb_data_home_dir為空,則默認(rèn)存放在datadir下,初始化大小為10MB)里面,而這個(gè)表空間可以由很多個(gè)文件組成,一個(gè)表可以跨多個(gè)文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。
2)使用獨(dú)立表空間(多表空間)存儲(chǔ),這種方式創(chuàng)建的表的表結(jié)構(gòu)仍然保存在.frm文件中,但是每個(gè)表的數(shù)據(jù)和索引單獨(dú)保存在.ibd中。如果是個(gè)分區(qū)表,那么每個(gè)分區(qū)對(duì)應(yīng)單獨(dú)的.ibd文件,文件名是“表名+分區(qū)名”,可以在創(chuàng)建分區(qū)的時(shí)候指定每個(gè)分區(qū)的數(shù)據(jù)文件的位置,以此來將表的I/O均勻分布在多個(gè)磁盤上。
若要使用獨(dú)立表空間的存儲(chǔ)方式,那么需要設(shè)置參數(shù)innodb_file_per_table為ON,并且重新啟動(dòng)服務(wù)后才可以生效。修改innodb_file_per_table的參數(shù)值即可修改數(shù)據(jù)庫(kù)的默認(rèn)表空間管理方式,但是修改不會(huì)影響之前已經(jīng)使用過的共享表空間和獨(dú)立表空間。
ON代表獨(dú)立表空間管理,OFF代表共享表空間管理。若要查看單表的表空間管理方式,則需要查看每個(gè)表是否有單獨(dú)的數(shù)據(jù)文件。該參數(shù)從MySQL5.6.6開始默認(rèn)為ON(之前的版本均為OFF),表示默認(rèn)為獨(dú)立表空間管理。
獨(dú)立表空間的數(shù)據(jù)文件沒有大小限制,不需要設(shè)置初始大小,也不需要設(shè)置文件的最大限制、擴(kuò)展大小等參數(shù)。對(duì)于使用多表空間特性的表,可以比較方便地進(jìn)行單表備份和恢復(fù)操作,但是直接復(fù)制.ibd文件是不行的,因?yàn)闆]有共享表空間的數(shù)據(jù)字典信息,直接復(fù)制的.ibd文件和.frm文件恢復(fù)時(shí)是不能被正確識(shí)別的,但可以通過命令:“ALTERTABLEtb_nameDISCARDTABLESPACE;”和“ALTERTABLEtb_nameIMPORTTABLESPACE;”將備份恢復(fù)到數(shù)據(jù)庫(kù)中,但是這樣的單表備份,只能恢復(fù)到表原來所在的數(shù)據(jù)庫(kù)中,而不能恢復(fù)到其他的數(shù)據(jù)庫(kù)中。如果要將單表恢復(fù)到目標(biāo)數(shù)據(jù)庫(kù),那么需要通過mysqldump和mysqlimport來實(shí)現(xiàn)。
需要注意的是,即便在獨(dú)立表空間的存儲(chǔ)方式下,共享表空間仍然是必需的。InnoDB會(huì)把內(nèi)部數(shù)據(jù)字典、在線重做日志、Undo信息、插入緩沖索引頁、二次寫緩沖(DoubleWriteBuffer)等內(nèi)容放在這個(gè)文件中。
共享表空間和獨(dú)立表空間的優(yōu)缺點(diǎn)見下表。
共享表空間(SharedTablespaces)獨(dú)立表空間(File-Per-TableTablespaces)優(yōu)點(diǎn)1)表空間可以分成多個(gè)文件存放到各個(gè)磁盤,所以表也就可以分成多個(gè)文件存放在磁盤上,表的大小不受磁盤大小的限制2)數(shù)據(jù)和文件放在一起方便管理1)當(dāng)truncate或者drop一個(gè)表時(shí)可以釋放磁盤空間。如果不是獨(dú)立表空間,truncate或drop一個(gè)表只是在ibdata文件內(nèi)部釋放,實(shí)際ibdata文件并不會(huì)縮小,釋放出來的空間也只能讓其似InnoDB引擎的表使用2)獨(dú)立表空間下,truncatetable操作會(huì)更快3)獨(dú)立表空間下,可以自定義表的存儲(chǔ)位置,通過CREATETABLE...DATADIRECTDRY=absolute_path_to_directory命令實(shí)現(xiàn)(有時(shí)將部分熱表放在不同的磁盤可有效地提升I/O性能)4)獨(dú)立表空間下,可以回收表空間碎片(比如一個(gè)非常大的DELETE操作之后釋放的空間)5)可以移動(dòng)單獨(dú)的InnoDB表,而不是整個(gè)數(shù)據(jù)庫(kù)6)可以copy單獨(dú)的InnoDB表從一個(gè)實(shí)例到另外一個(gè)實(shí)例(也就是transportabletablespace特色)7)獨(dú)立表空間模式下,可以使用Barracuda的文件格式,這個(gè)文件格式有壓縮和動(dòng)態(tài)行模式(DynamicRowFormat)的特色。當(dāng)表中有blob或者text字段時(shí),動(dòng)態(tài)行模式可以發(fā)揮出更高彭的存儲(chǔ)8)獨(dú)立表空間模式下,可以更好地改善故障恢復(fù),比如更加節(jié)約時(shí)間或者增加崩潰后正?;謴?fù)的概率9)單獨(dú)備份和恢復(fù)某張表時(shí)會(huì)更快10)可以從一個(gè)備份中單獨(dú)分離出表,比如一個(gè)lvm的快照備份11)可以在不訪問MySQL的情況下方便地得知一個(gè)表的大小,即在文件系統(tǒng)的角度上查看12)在大部分的linux文件系統(tǒng)中,如果InnoDB_flush_method為O_DIRECT,通常是不允許針對(duì)同一個(gè)文件做并發(fā)寫操作的。這時(shí)如果為獨(dú)立表空間模式,那么應(yīng)該會(huì)有較大的性能提升13)如果沒有使用獨(dú)立表空間模式,那么所有的表都在共享表空間,最大為64TB,如果使用innodb_file_per_table,那么每個(gè)表可以達(dá)到64TB14)運(yùn)行OPTIMEIZETABLE,壓縮或者重新創(chuàng)建表空間。運(yùn)行OPTIMIZETABLEInnoDB會(huì)創(chuàng)建一個(gè)新的ibd文件。當(dāng)完成時(shí),老的表空間會(huì)被新的代替缺點(diǎn)1)所有的數(shù)據(jù)和索引存放到一個(gè)文件,雖然可以把一個(gè)大文件分成多個(gè)小文件,但是多個(gè)表及索引在表空間中混合存儲(chǔ),當(dāng)數(shù)據(jù)量非常大的時(shí)候,表做了火量刪除操作后表空間中將會(huì)有火量的空隙,特別是對(duì)于統(tǒng)計(jì)分析,對(duì)于經(jīng)常刪除操作的這類應(yīng)用最不適合用共享表空間2)共享表空間分配后不能回縮:當(dāng)臨時(shí)建索引或創(chuàng)建一個(gè)臨時(shí)表后,表空間被擴(kuò)大后,就是刪除相關(guān)的表也沒辦法回縮那部分空間3)進(jìn)行數(shù)據(jù)庫(kù)的冷備很慢1)獨(dú)立表空間模式下,每個(gè)表或許會(huì)有很多沒用到的磁盤空間。如果沒做好管理,可能會(huì)造成較大的空間浪費(fèi)。表空間中的空間只能被當(dāng)前表使用2)fsync操作必須運(yùn)行在每一個(gè)單一的文件上,獨(dú)立表空間模式下,多個(gè)表的寫操作就無法臺(tái)并為一個(gè)單一的I/O,這樣就添加許多額外的fsync操作3)mysqld必須保證每個(gè)表都有一個(gè)openfile,獨(dú)立表空間模式下,這樣就需要很多打開文付數(shù),可能會(huì)影響性能4)當(dāng)drop一個(gè)表空間時(shí),bufferpool會(huì)被掃描,如果bufferpool有幾十GB那么大,或許要花費(fèi)幾秒鐘時(shí)間。這個(gè)掃描操作還會(huì)產(chǎn)生一個(gè)內(nèi)部鎖,可能會(huì)延遲其他操作,共享表空間模式下不會(huì)有這個(gè)問題5)如果許多表都增長(zhǎng)迅速,那么可能會(huì)產(chǎn)生更多的分裂操作(應(yīng)該指的是表空間大小的擴(kuò)充),這個(gè)操作會(huì)損害droptable和tablescan的性能6)InnoDB_autoextend_increment參數(shù)對(duì)獨(dú)立表空間無效,這個(gè)參數(shù)指的是當(dāng)系統(tǒng)表空間滿了以后,它再次預(yù)先申請(qǐng)的磁盤空間大小,單位為MB7)單表增加過大,當(dāng)單表占用空間過大時(shí),存儲(chǔ)空間不足,只能從操作系統(tǒng)層面思考解決方法[考點(diǎn)]存儲(chǔ)引擎
18.
什么是間隙(Next-Key)鎖?正確答案:當(dāng)使用范圍條件而不是相等條件檢索數(shù)據(jù)的時(shí)候,并請(qǐng)求共享或排它鎖時(shí),InnoDB會(huì)給符合條件的已有數(shù)據(jù)記錄的索引項(xiàng)加鎖;對(duì)于鍵值在條件范圍內(nèi)但并不存在的記錄,叫作“間隙(GAP)”,InnoDB也會(huì)對(duì)這個(gè)“間隙”加鎖,這種鎖機(jī)制就是所謂的間隙(Next-Key)鎖。間隙鎖是InnoDB中行鎖的一種,但是這種鎖鎖住的不止一行數(shù)據(jù),它鎖住的是多行,是一個(gè)數(shù)據(jù)范圍。間隙鎖的主要作用是為了防止出現(xiàn)幻讀(PhantomRead),用在Repeated-Read(簡(jiǎn)稱RR)隔離級(jí)別下。在Read-commited(簡(jiǎn)稱RC)下,一般沒有間隙鎖(有外鍵情況下例外,此處不考慮)。間隙鎖還用于恢復(fù)和復(fù)制。
間隙鎖的出現(xiàn)主要集中在同一個(gè)事務(wù)中先DELETE后INSERT的情況,當(dāng)通過一個(gè)條件刪除一條記錄的時(shí)候,如果條件在數(shù)據(jù)庫(kù)中已經(jīng)存在,那么這個(gè)時(shí)候產(chǎn)生的是普通行鎖,鎖住這個(gè)記錄,然后刪除,最后釋放鎖。如果這條記錄不存在,那么問題就來了,數(shù)據(jù)庫(kù)會(huì)掃描索引,發(fā)現(xiàn)這個(gè)記錄不存在,這個(gè)時(shí)候的DELETE語句獲取到的就是一個(gè)間隙鎖,然后數(shù)據(jù)庫(kù)會(huì)向左掃描,掃到第一個(gè)比給定參數(shù)小的值,向右掃描,掃描到第一個(gè)比給定參數(shù)大的值,然后以此為界,構(gòu)建一個(gè)區(qū)間,鎖住整個(gè)區(qū)間內(nèi)的數(shù)據(jù),一個(gè)特別容易出現(xiàn)死鎖的間隙鎖就誕生了。
在MySQL的InnoDB存儲(chǔ)引擎中,如果更新操作是針對(duì)一個(gè)區(qū)間的,那么它會(huì)鎖住這個(gè)區(qū)間內(nèi)所有的記錄,例如,UPDATEXXXXWHEREIDBETWEENAANDB,那么它會(huì)鎖住A到B之間所有記錄,注意是所有記錄,甚至這個(gè)記錄并不存在也會(huì)被鎖住,這個(gè)時(shí)候,如果另外一個(gè)連接需要插入一條記錄到A與B之間,那么它就必須等到上一個(gè)事務(wù)結(jié)束。典型的例子就是使用AUTO_INCREMENTID,由于這個(gè)ID是一直往上分配的,因此,當(dāng)兩個(gè)事務(wù)都INSERT時(shí),會(huì)得到兩個(gè)不同的ID,但是這兩條記錄還沒有被提交,因此,也就不存在,如果這個(gè)時(shí)候有一個(gè)事務(wù)進(jìn)行范圍操作,而且恰好要鎖住不存在的ID,就是觸發(fā)間隙鎖問題。所以,MySQL中盡量不要使用區(qū)間更新。InnoDB除了通過范圍條件加鎖時(shí)使用間隙鎖外,如果使用相等條件請(qǐng)求給一個(gè)不存在的記錄加鎖,那么InnoDB也會(huì)使用間隙鎖!
間隙鎖也存在副作用,它會(huì)把鎖定范圍擴(kuò)大,有時(shí)候也會(huì)帶來麻煩。如果要關(guān)閉,那么一是將會(huì)話隔離級(jí)別改到RC下,或者開啟innodb_locks_unsafe_for_binlog(默認(rèn)是OFF)。間隙鎖只會(huì)出現(xiàn)在輔助索引上,唯一索引和主鍵索引是沒有間隙鎖。間隙鎖(無論是S還是X)只會(huì)阻塞INSERT操作。
在MySQL數(shù)據(jù)庫(kù)參數(shù)中,控制間隙鎖的參數(shù)是innodb_locks_unsafe_for_binlog,這個(gè)參數(shù)的默認(rèn)值是OFF,也就是啟用間隙鎖,它是一個(gè)布爾值,當(dāng)值為TRUE時(shí),表示DISABLE間隙鎖。[考點(diǎn)]鎖
19.
MySQL有哪些命令可以查看鎖?正確答案:有如下幾個(gè)命令:
(1)showprocesslist
“showprocesslist;”顯示哪些線程正在運(yùn)行。如果有SUPER權(quán)限,那么就可以看到所有線程。如果有線程在UPDATE或者INSERT某個(gè)表,此時(shí)進(jìn)程的status為updating或者sendingdata?!皊howprocesslist;”只列出前100條,如果想全列出,那么可以使用“showfullprocesslist;”。
下面是一些常見的狀態(tài)。狀態(tài)含義Checkingtable正在檢查數(shù)據(jù)表(這是自動(dòng)的)Closingtables正在將表中修改的數(shù)據(jù)刷新到磁盤中,同時(shí)正在關(guān)閉已經(jīng)用完的表。這是一個(gè)很快的操作,如果不是這樣的話,那么就應(yīng)該確認(rèn)磁盤空間是否已經(jīng)滿了或者磁盤是甭正處于重負(fù)中Connectout復(fù)制從服務(wù)器正在連接主服務(wù)器Copyingtotmptableondisk由于臨時(shí)結(jié)果集大于map_table_size,正在將臨時(shí)表從內(nèi)存存儲(chǔ)轉(zhuǎn)為磁盤存儲(chǔ),以此節(jié)省內(nèi)存Creatingtmptable正在創(chuàng)建臨時(shí)表以存放部分查詢結(jié)果Deletingfrommaintable服務(wù)器正在執(zhí)行多表刪除中的第一部分,剛刪除第一個(gè)表Deletingfromreferencetables服務(wù)器正在執(zhí)行多表刪除中的第二部分,正在刪除其他表的記錄Flushingtables正在執(zhí)行FLUSHTABLES,等待其他線程關(guān)閉數(shù)據(jù)表Kilied發(fā)送了一個(gè)kill請(qǐng)求給某線程,那么這個(gè)線程將會(huì)檢查kill標(biāo)志位,同時(shí)會(huì)放棄下一個(gè)kill請(qǐng)求。MySQL會(huì)在每次的主循環(huán)中檢查kill標(biāo)志位,不過有些情況下該線程可能會(huì)過一小段才能死掉。如果該線程被其他線程鎖住了,那么kill請(qǐng)求會(huì)在鎖釋放時(shí)馬上生效Locked被其他查詢鎖住了Sendingdata正在處理SELECT查詢的記錄,同時(shí)正在把結(jié)果發(fā)送給客戶端Sortingforgroup正在為GROUPBY做排序Sortingfororder正在為ORDERBY做排序Openingtables這個(gè)過程應(yīng)該會(huì)很快,除非受到其他因素的干擾。例如,在執(zhí)行完ALTERTABLE或LOCKTABLE語句以前,數(shù)據(jù)表無法被其他線程打開。正嘗試打開一個(gè)表Removingduplicates正在執(zhí)行一個(gè)SELECTDISTINCT方式的查詢,但是MySQL無法在前一個(gè)階段優(yōu)化掉那些重復(fù)的記錄。因此,MySQL需要再次去掉重復(fù)的記錄,然后再把結(jié)果發(fā)送給客戶端Reopentable獲得了對(duì)一個(gè)表的鎖,但是必須在表結(jié)構(gòu)修改之后才能獲得這個(gè)鎖。已經(jīng)釋放鎖,關(guān)閉數(shù)據(jù)表,正嘗試重新打開數(shù)據(jù)表Repairbysorting修復(fù)指令正在排序以創(chuàng)建索引Repairwithkeycache修復(fù)指令正在利用索引緩存一個(gè)一個(gè)地創(chuàng)建新索引。它會(huì)比Repairbysorting慢些Searchingrowsforupdate正在將符合條件的記錄找出來以備更新。它必須在UPDATE要修改相關(guān)的記錄之前就完成了Sleeping正在等待客戶端發(fā)送新請(qǐng)求Systemlock正在等待取得一個(gè)外部的系統(tǒng)鎖。如果當(dāng)前沒有運(yùn)行多個(gè)mysqld服務(wù)器同時(shí)請(qǐng)求同一個(gè)表,那么可以通過增加--skip-extemal-locking參數(shù)來禁止外部系統(tǒng)鎖UpgradinglockINSERTDELAYED正在嘗試取得一個(gè)鎖表以插入新記錄Updating正在搜索匹配的記錄,并且修改它們Userlock正在等待GET_LOCK()Waitingfortables該線程得到通知,數(shù)據(jù)表結(jié)構(gòu)已經(jīng)被修改了,需要重新打開數(shù)據(jù)表以取得新的結(jié)構(gòu)。然后,為了能重新打開數(shù)據(jù)表,必須等到所有其他線程關(guān)閉這個(gè)表。以下幾種情況下會(huì)產(chǎn)生這個(gè)通知:FLUSHTABLEStb1_name,ALTERTABLE,RENAMETABLE,REPAIRTABLE,ANALYZETABLE或OPTIMIZETABLEWaitingforhandlerinsertINSERTDELAYED已經(jīng)處理完了所有待處理的插入操作,正在等待新的請(qǐng)求
(2)showopentables
這條命令能夠查看當(dāng)前有哪些表是打開的。in_use列表示有多少線程正在使用某張表,name_locked表示表名是否被鎖,這一般發(fā)生在DROP或RENAME命令操作這張表時(shí)。所以這條命令不能查詢到當(dāng)前某張表是否有死鎖,誰擁有表上的這個(gè)鎖等。常用命令如下:
showopentablefromdb_name;
showopentableswherein_use>0;
(3)showengineinnodbstatus\G;
這條命令查詢innodb引擎的運(yùn)行時(shí)信息。
(4)查看服務(wù)器的狀態(tài)
showstatuslike'%lock%';
(5)查詢INFORMATION_SCHEMA用戶下的表
通過INFORMATION_SHCEMA下的INNODB_LOCKS、INNODB_LOCK_WAITS和INNODB_TRX這三張表可以更新監(jiān)控當(dāng)前事務(wù)并且分析存在的鎖問題。
查看當(dāng)前狀態(tài)產(chǎn)生的innodb鎖,僅在有鎖等待時(shí)有結(jié)果輸出:
SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;
查看當(dāng)前狀態(tài)產(chǎn)生的innodb鎖等待,僅在有鎖等待時(shí)有結(jié)果輸出:
SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCK_WAITS;
當(dāng)前innodb內(nèi)核中的活躍(ACTIVE)事務(wù):
SELECT*FROMINFORMATION_SCHEMA.INNODB_TRX;[考點(diǎn)]鎖
20.
MySQL如何查看執(zhí)行計(jì)劃?執(zhí)行計(jì)劃中每列的含義分別是什么?正確答案:執(zhí)行計(jì)劃的查看是進(jìn)行SQL語句調(diào)優(yōu)時(shí)的一個(gè)重要依據(jù),MySQL的執(zhí)行計(jì)劃查看相對(duì)Oracle簡(jiǎn)便很多,功能也相對(duì)簡(jiǎn)單。MySQL的EXPLAIN命令用于SQL語句的查詢執(zhí)行計(jì)劃(QEP)。從這條命令的輸出結(jié)果中能夠了解MySQL優(yōu)化器是如何執(zhí)行SQL語句的。這條命令并沒有提供任何調(diào)整建議,但它能夠提供重要的信息用來幫助做出調(diào)優(yōu)決策。
MySQL的EXPLAIN語法可以運(yùn)行在SELECT語句或者特定表上。如果作用在表上,那么此命令等同于DESC表命令。在MySQL5.6.10版本里面,可以直接對(duì)DML語句進(jìn)行EXPLAIN分析操作。MySQL優(yōu)化器是基于開銷來工作的,它并不提供任何的QEP的位置。這意味著QEP是在每條SQL語句執(zhí)行的時(shí)候動(dòng)態(tài)地計(jì)算出來的。在MySQL存儲(chǔ)過程中的SQL語句也是在每次執(zhí)行時(shí)計(jì)算QEP的。存儲(chǔ)過程緩存僅僅解析查詢樹。
下面給出一個(gè)MySQL執(zhí)行計(jì)劃的示例:
下面介紹每種指標(biāo)的含義:
(1)id
id包含一組數(shù)字,表示查詢中執(zhí)行SELECT子句或操作表的順序;執(zhí)行順序從大到小執(zhí)行;當(dāng)id值一樣的時(shí)候,執(zhí)行順序由上往下。
(2)select_type
select_type表示查詢中每個(gè)SELECT子句的類型,最常見的值包括SIMPLE、PRIMARY、DERIVED和UNION。其他可能的值還有UNIONRESULT、DEPENDENTSUBQUERY、DEPENDENTUNION、UNCACHEABLEUNION以及UNCACHEABLEQUERY。
1)SIMPLE:查詢中不包含子查詢、表連接或者UNION其他復(fù)雜語法的簡(jiǎn)單查詢,這是一個(gè)常見的類型。
2)PRIMARY:查詢中若包含任何復(fù)雜的子查詢,最外層查詢則被標(biāo)記為PRIMARY。這個(gè)類型通??梢栽贒ERIVED和UNION類型混合使用時(shí)見到。
3)SUBQUERY:在SELECT或WHERE列表中包含了子查詢,該子查詢被標(biāo)記為SUBQUERY。
4)DE
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024分期付款協(xié)議全新版
- 2024年上海廠房租賃協(xié)議范本
- 2024年產(chǎn)業(yè)用紡織品購(gòu)銷協(xié)議
- 2024年辦公自動(dòng)化設(shè)備訂購(gòu)協(xié)議
- 2024年區(qū)域市場(chǎng)拓展合作框架協(xié)議
- 2024年共同經(jīng)營(yíng)協(xié)議:聯(lián)手創(chuàng)辦工廠共享利潤(rùn)與風(fēng)險(xiǎn)
- 2024年發(fā)布:科技輔導(dǎo)學(xué)校學(xué)生托管協(xié)議
- 2024年企業(yè)與員工間安全協(xié)議全案
- 2024年全新版?zhèn)}儲(chǔ)租賃協(xié)議
- 2024年專用設(shè)備租賃協(xié)議范本
- 統(tǒng)編版二年級(jí)語文上冊(cè)口語交際:商量 說課稿
- 手工折紙:蝴蝶課件
- HSK四級(jí)聽力答題技巧課件
- 人教部編版《道德與法治》三年級(jí)上冊(cè)第8課《安全記心上》說課課件
- 防雷資格證考試試題
- 監(jiān)控及存儲(chǔ)系統(tǒng)方案投標(biāo)書
- 甲骨文專題課品課件
- 中草藥高效栽培技術(shù)課件
- 人教版數(shù)學(xué)三年級(jí)上冊(cè) 6.3 筆算乘法(不進(jìn)位)課件(9張PPT)
- 埋地管道施工方案(標(biāo)準(zhǔn)版)
- 【政治教學(xué)課件】加強(qiáng)國(guó)家的宏觀調(diào)控(通用)
評(píng)論
0/150
提交評(píng)論