數(shù)據(jù)庫程序員面試分模擬題2_第1頁
數(shù)據(jù)庫程序員面試分模擬題2_第2頁
數(shù)據(jù)庫程序員面試分模擬題2_第3頁
數(shù)據(jù)庫程序員面試分模擬題2_第4頁
數(shù)據(jù)庫程序員面試分模擬題2_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

數(shù)據(jù)庫程序員面試分模擬題2簡答題1.

在Undo表空間數(shù)據(jù)文件丟失的情況下如何恢復?正確答案:恢復大約可以分為3種情況:①有備份,這種情況下直接采用備份的文件進行恢復即可;②無備份但是有完整的歸檔(江南博哥)文件存在,這種情況下可以使用命令“ALTERDATABASECREATEDATAFILE文件號AS'/u01/app/oracle/oradata/lhrdb/undotbs01.dbf'size50m;”來創(chuàng)建丟失的Undo文件,然后使用“RECOVERDATAFILE文件號;”進行數(shù)據(jù)庫文件恢復即可;③無備份,歸檔文件丟失,在這種情況下的恢復比較復雜。首先應該切換Undo表空間到一個新建的Undo表空間中,并設置原有表空間的管理模式為手動管理模式,然后將隱含參數(shù)“_OFFLINE_ROLLBACK_SEGMENTS”設置為TRUE,一些關鍵性的命令如下:

ALTERSYSTEMSETUNDO_TABLESPACE=UNDOTBS2SCOPE=SPFILE;

ALTERSYSTEMSETUNDO_MANAGEMENT=MANUALSCOPE=SPFILE;

ALTERSYSTEMSET"_OFFLINE_ROLLBACK_SEGMENTS"=TRUESCOPD=SPFILE;

ALTERSYSTEMSET"_CORRUPTED_ROLLBACK_SEGMENTS"='_SYSSMU1$','_SYSSMU2$'SCOPE=SPFILE;

CREATEUNDOTABLESPACEUNDOTBS1DATAFILE'/u03/app/oracte/oradata/ora1024g/undotbs01.dbf'SIZE50MAUTOEXTENDON;

ALTERSYSTEMSETUNDO_TABLESPACE=UNDOTES1

SCOPE=SPFILE;

ALTERSYSTEMSETUNDO_MANAGEMENT=AUTO

SCOPE=SPFILE;

ALTERSYSTEMRESET"_OFFLINE_ROLLBACK_SEGMENTS"SCOPE=SPFILESID='*';

ALTERSYSTEMRESET"_CORRUPTED_ROLLBACK_SEGMENTS"SCOPE=SPFILESID='*';[考點]RMAN

2.

什么是間隙(Next-Key)鎖?正確答案:當使用范圍條件而不是相等條件檢索數(shù)據(jù)的時候,并請求共享或排它鎖時,InnoDB會給符合條件的已有數(shù)據(jù)記錄的索引項加鎖;對于鍵值在條件范圍內(nèi)但并不存在的記錄,叫作“間隙(GAP)”,InnoDB也會對這個“間隙”加鎖,這種鎖機制就是所謂的間隙(Next-Key)鎖。間隙鎖是InnoDB中行鎖的一種,但是這種鎖鎖住的不止一行數(shù)據(jù),它鎖住的是多行,是一個數(shù)據(jù)范圍。間隙鎖的主要作用是為了防止出現(xiàn)幻讀(PhantomRead),用在Repeated-Read(簡稱RR)隔離級別下。在Read-commited(簡稱RC)下,一般沒有間隙鎖(有外鍵情況下例外,此處不考慮)。間隙鎖還用于恢復和復制。

間隙鎖的出現(xiàn)主要集中在同一個事務中先DELETE后INSERT的情況,當通過一個條件刪除一條記錄的時候,如果條件在數(shù)據(jù)庫中已經(jīng)存在,那么這個時候產(chǎn)生的是普通行鎖,鎖住這個記錄,然后刪除,最后釋放鎖。如果這條記錄不存在,那么問題就來了,數(shù)據(jù)庫會掃描索引,發(fā)現(xiàn)這個記錄不存在,這個時候的DELETE語句獲取到的就是一個間隙鎖,然后數(shù)據(jù)庫會向左掃描,掃到第一個比給定參數(shù)小的值,向右掃描,掃描到第一個比給定參數(shù)大的值,然后以此為界,構(gòu)建一個區(qū)間,鎖住整個區(qū)間內(nèi)的數(shù)據(jù),一個特別容易出現(xiàn)死鎖的間隙鎖就誕生了。

在MySQL的InnoDB存儲引擎中,如果更新操作是針對一個區(qū)間的,那么它會鎖住這個區(qū)間內(nèi)所有的記錄,例如,UPDATEXXXXWHEREIDBETWEENAANDB,那么它會鎖住A到B之間所有記錄,注意是所有記錄,甚至這個記錄并不存在也會被鎖住,這個時候,如果另外一個連接需要插入一條記錄到A與B之間,那么它就必須等到上一個事務結(jié)束。典型的例子就是使用AUTO_INCREMENTID,由于這個ID是一直往上分配的,因此,當兩個事務都INSERT時,會得到兩個不同的ID,但是這兩條記錄還沒有被提交,因此,也就不存在,如果這個時候有一個事務進行范圍操作,而且恰好要鎖住不存在的ID,就是觸發(fā)間隙鎖問題。所以,MySQL中盡量不要使用區(qū)間更新。InnoDB除了通過范圍條件加鎖時使用間隙鎖外,如果使用相等條件請求給一個不存在的記錄加鎖,那么InnoDB也會使用間隙鎖!

間隙鎖也存在副作用,它會把鎖定范圍擴大,有時候也會帶來麻煩。如果要關閉,那么一是將會話隔離級別改到RC下,或者開啟innodb_locks_unsafe_for_binlog(默認是OFF)。間隙鎖只會出現(xiàn)在輔助索引上,唯一索引和主鍵索引是沒有間隙鎖。間隙鎖(無論是S還是X)只會阻塞INSERT操作。

在MySQL數(shù)據(jù)庫參數(shù)中,控制間隙鎖的參數(shù)是innodb_locks_unsafe_for_binlog,這個參數(shù)的默認值是OFF,也就是啟用間隙鎖,它是一個布爾值,當值為TRUE時,表示DISABLE間隙鎖。[考點]鎖

3.

如何在執(zhí)行恢復的時候?qū)?shù)據(jù)文件恢復到別的路徑?正確答案:主要采用命令“setnewnamefordatafile”和“switchdatafileall;”。[考點]RMAN

4.

如何插入單引號到數(shù)據(jù)庫表中?正確答案:可以用ASCII碼處理,其他特殊字符如&也一樣,如下:

INSERTINTOTVALUES('I'||CHR(39)||'m');

--CHR(39)代表字符'

或者用兩個單引號表示一個:

INSERTINTOTVALUES('I"m');

--兩個"可以表示一個'

5.

密碼延遲驗證是什么?如何屏蔽?正確答案:從Oracle11g開始,如果一個用戶使用不正確的密碼嘗試登錄數(shù)據(jù)庫,那么隨著登錄失敗次數(shù)的增加,每次登錄驗證前延遲等待的時間也會增加。

通過設置EVENTS28401可以屏蔽密碼延遲驗證:

ALTERSYSTEMSETEVENT='28401TRACENAMECONTEXTFOREVER,LEVEL1'SCOPE=SPFILE;

設置該事件后重啟數(shù)據(jù)庫即可。關于28401事件的解釋如下:

[oracle@orclalhr~]$oerrora284D1

28401,00000,"Eventtodisabledelayafterthreefailedloginattempts"

//*Document:NO

//*Cause:N/A

//*Action:Setthiseventinyourenvironmenttodisablethelogindelay

//

whichwillotherwisetakeplaceafierthreefailedloginattempts.

//*Note:THISISNOTAUSERERRORNUMBER/MESSAGE.THISDOESNOTNEEDTOBE

//

TRANSLATEDORDOCUMENTED.

對于正常的系統(tǒng),由于密碼的更改,可能存在某些被遺漏的客戶端,不斷重復嘗試使用錯誤密碼登錄數(shù)據(jù)庫,從而引起數(shù)據(jù)庫內(nèi)部長時間的“l(fā)ibrarycachelock”或“rowcachelock”的等待,這種情形非常常見。這種現(xiàn)象在Oracle10.2和11.1中體現(xiàn)的等待事件為“rowcachelock”,而在Oracle11.2中體現(xiàn)的等待事件為“l(fā)ibrarycachelock”。

當出現(xiàn)這類問題時,非常典型的AWR報告呈現(xiàn)如下。首先在TOP5中,可能會看到顯著的librarycachelock的等待,以下范例來自Oracle版本的真實情況:

若數(shù)據(jù)庫版本小于11.2,則在AWR中可能的情況如下:

在這類情況下,時間模型(TimeModelStatistics)中會顯示如下指標,其中,“connectionmanagementcallelapsedtime”占據(jù)了主要的DBTime,這個等待直接表明是在建立數(shù)據(jù)庫連接時產(chǎn)生的:

此外,在AWR中的DictionaryCacheStats部分也可以看到很明顯的等待。

此問題在MOS上相應的文檔為“High'librarycachelock'WaitTimeDuetoInvalidLoginARempts(1309738.1)”。此外,從Oracle11g開始,開啟了密碼大小寫驗證,如果數(shù)據(jù)庫是從Oracle10g升級或遷移過來的,那么需要特別地注意這個變化,可以通過初始化參數(shù)SEC_CASE_SENSITIVE_LOGON來控制這個特性。[考點]用戶

6.

什么是SQL語言?SQL有哪些特點?正確答案:SQL(StructureQueryLanguage,結(jié)構(gòu)化查詢語言)是一種在關系型數(shù)據(jù)庫中定義和操縱數(shù)據(jù)的標準語言。關系型數(shù)據(jù)庫采用SQL作為客戶端程序與數(shù)據(jù)庫服務器間溝通的標準接口。客戶端發(fā)送SQL指令到服務器端,服務器端執(zhí)行相關的指令并返回其查詢的結(jié)果。在數(shù)據(jù)庫服務器端執(zhí)行的SQL指令可以實現(xiàn)各種數(shù)據(jù)庫操作和管理功能,例如,數(shù)據(jù)的查詢和更新(包括添加、修改和刪除數(shù)據(jù))操作;創(chuàng)建、修改和刪除各種數(shù)據(jù)庫對象(如數(shù)據(jù)表、視圖、索引等);數(shù)據(jù)庫用戶賬戶管理、權(quán)限管理等。

關系數(shù)據(jù)語言的共同特點:語言具有完備的表達能力,是非過程化的集合操作語言,功能強,能夠嵌入高級語言中使用。[考點]SQL分類

7.

Linux下如何查看系統(tǒng)啟動時間和運行時間?正確答案:可以用uptime和查看/proc/uptime文件。

1)uptime命令

輸出:16:11:40up59days,4:21,2users,loadaverage:0.00,0.01,0.00

2)查看/proc/uptime文件計算系統(tǒng)啟動時間

cat/proc/uptime

輸出:5113396.94575949.85

第一數(shù)字即是系統(tǒng)己運行的時間5113396.94秒,運用系統(tǒng)工具date即可算出系統(tǒng)啟動時間。

date-d"$(awk-F'{print$1}'/proc/uptime)secondago"+"%Y-%m-%d%H:%M:%S"

輸出:2008-11-0911:50:31

3)查看/proc/uptime文件計算系統(tǒng)運行時間

more/proc/uptime|awk-F.'{run_days=$1/86400;run_hour=($1%86400)/3600;run_minute=($1%3600)/60;run_second=$1%60;printf("系統(tǒng)已運行:%d天%d時%d分%d秒\n",run_days,run_hour,run_minute,run_second)}'

輸出:系統(tǒng)已運行:59天4時13分9秒

此外,還可以使用如下命令查詢:

who-b查看最后一次系統(tǒng)啟動的時間

who-r查看當前系統(tǒng)運行時間

lastreboot可以看到Linux系統(tǒng)歷史啟動的時間

top命令的up后表示系統(tǒng)到目前運行了多久時間

w命令的up后表示系統(tǒng)到目前運行了多久時間

8.

MySQL中的索引有什么優(yōu)點?正確答案:索引(Index)是數(shù)據(jù)庫優(yōu)化中最常用也是最重要的手段之一,通過索引通常可以幫助用戶解決大多數(shù)的SQL性能問題。索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),它用于快速找出在某個列中含有某一特定值的行。如果不使用索引,那么MySQL必須從第1條記錄開始讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,那么MySQL就能快速到達一個位置去搜尋數(shù)據(jù)文件的中間,沒有必要看所有數(shù)據(jù)。

索引在MySQL中也叫作“鍵(Key)”,是存儲引擎用于快速找到記錄的一種數(shù)據(jù)結(jié)構(gòu)。總體來說,索引有如下幾個優(yōu)點:

1)索引大大減少了服務器需要掃描的數(shù)據(jù)量。

2)索引可以幫助服務器避免排序和臨時表。

3)索引可以將隨機I/O變?yōu)轫樞騃/O。[考點]索引

9.

E-R圖向關系模型的轉(zhuǎn)換一般遵循哪些原則?正確答案:E-R圖向關系模型的轉(zhuǎn)換一般遵循如下原則:

1)一個實體型轉(zhuǎn)換為一個關系模式。實體的屬性就是關系的屬性。實體的碼就是關系的碼。

例如,學生實體可以轉(zhuǎn)換為如下關系模式,其中,學號為學生關系的碼:

學生(學號,姓名,出生日期,所在系,年級,平均成績)。同樣,性別、宿舍、班級、檔案材料、教師、課程、教室、教科書都分別轉(zhuǎn)換為一個關系模式。

2)一個聯(lián)系轉(zhuǎn)化為一個關系模式,與該聯(lián)系相連的各實體的碼以及聯(lián)系的屬性轉(zhuǎn)化為關系的屬性。該關系的碼有如下3種情況:

①若聯(lián)系為1:1,則每個實體的碼均是該關系的候選碼。

②若聯(lián)系為1:n,則關系的碼為n端實體的碼。

③若聯(lián)系為m:n,則關系的碼為諸實體碼的組合。

下面分別來講解這3種情況。

①聯(lián)系為1:1

一個1:1聯(lián)系可以轉(zhuǎn)換為一個獨立的關系模式,也可以與任意一端對應的關系模式合并。

a)如果轉(zhuǎn)換為一個獨立的關系模式,那么與該聯(lián)系相連的各實體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關系的屬性,每個實體的碼均是該關系的候選碼。

b)如果與某一端對應的關系模式合并,那么需要在該關系模式的屬性中加入另一個關系模式的碼和聯(lián)系本身的屬性。

②聯(lián)系為1:n

一個1:n聯(lián)系可以轉(zhuǎn)換為一個獨立的關系模式,也可以與n端對應的關系模式合并。

a)如果轉(zhuǎn)換為一個獨立的關系模式,那么與該聯(lián)系相連的各實體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關系的屬性,而關系的碼為n端實體的碼。

b)如果與n端對應的關系模式合并,那么在n端實體對應模式中加入1端實體所對應關系模式的碼,以及聯(lián)系本身的屬性。而關系的碼為n端實體的碼。

③聯(lián)系為m:n

一個m:n聯(lián)系轉(zhuǎn)換為一個關系模式。與該聯(lián)系相連的各實體的碼以及聯(lián)系本身的屬性均轉(zhuǎn)換為關系的屬性,而關系的碼為各實體碼的組合。

3)同一實體集的實體間的聯(lián)系,即自聯(lián)系,也可按上述1:1、1:n和m:n三種情況分別處理。

例如,如果教師實體集內(nèi)部存在領導與被領導的1:n自聯(lián)系,那么可以將該聯(lián)系與教師實體合并,這時主鍵職工號將多次出現(xiàn),但作用不同,可用不同的屬性名加以區(qū)分。例如,在合并后的關系模式中,主鍵仍為職工號,再增設一個“系主任”屬性,存放相應系主任的職工號。

4)具有相同碼的關系模式可合并。

為了減少系統(tǒng)中的關系個數(shù),如果兩個關系模式具有相同的主鍵,那么可以考慮將它們合并為一個關系模式。合并方法是將其中一個關系模式的全部屬性加入另一個關系模式中,然后去掉其中的同義屬性(可能同名也可能不同名),并適當調(diào)整屬性的次序。[考點]E-R模型

10.

在Oracle中,什么是異常?正確答案:異常(Exception)處理是用來處理正常執(zhí)行過程中未預料到的事件,包括程序塊的異常處理、預定義的錯誤和自定義錯誤。如果PL/SQL程序塊一旦產(chǎn)生異常,而程序并沒有指出如何處理,那么程序就會自動終止運行。

異常處理部分一般放在PL/SQL程序體的后半部分,結(jié)構(gòu)如下。

EXCEPTION

WHENfirst_exception

THEN

<codetohandlefirstexertion>

WHENsecond_exception

THEN

<codetohandlesecondexception>

WHENOTHERSTHEN<codetohandleOTHERSexception>[考點]程序處理

11.

RESETLOGS和NORESETLOGS的區(qū)別是什么?正確答案:RESETLOGS和NORESETLOGS主要用在兩個地方,第一是在創(chuàng)建控制文件的時候,第二是在打開數(shù)據(jù)庫的時候。當將控制文件備份到TRACE文件時,可以看到里面包含了兩部分的重建語句,一個是使用RESETLOGS,另一個是使用NORESETLOGS。

備份控制文件的SQL如下:

SQL>alterdatabasebackupcontrolfiletotraceas'/home/oracle/cct_etl_lhr.sql';

若當前的所有在線日志可用時,則在創(chuàng)建控制文件的時候使用NORESETLOGS。若當前的在線日志有所損壞時,則在創(chuàng)建控制文件的時候需要使用RESETLOGS。若使用RESETLOGS則將導致在線日志里的內(nèi)容丟失,并且所有的備份失效。

在打開數(shù)據(jù)庫的時候也可以使用RESETLOGS或NORESETLOGS選項。在做了不完全恢復后,RESETLOGS會初始化日志,重置日志序列號(從1開始),并且創(chuàng)建一個新的INCARNATION??梢允褂肦MAN命令查看INCARNATION的信息:

RMAN>LISTINCARNATION;

做不完全恢復必須使用RESETLOGS,但是RESETLOGS也可以做完全恢復。而NORESETLOGS則必須是在做完全恢復時使用。RESETLOGS會重置日志序列號,強制清空或重建在線日志,而NORESETLOGS則不會這么做。[考點]RMAN

12.

如何查找邏輯讀、物理讀、執(zhí)行次數(shù)和解析次數(shù)最多以及執(zhí)行時間最長的SQL語句?如何查找或監(jiān)控效率低下的SQL語句?正確答案:效率低下的SQL一股是執(zhí)行時間較長的SQL語句,可以通過如下幾種方式來監(jiān)控分析:

1)當前系統(tǒng)的SQL可以通過監(jiān)控V$SQL_MONITOR、V$SESSION視圖來實現(xiàn),記錄執(zhí)行時間較長的SQL語句。對于歷史SQL可以通過分析DBA_HIST_SQLSTAT視圖。

2)分析現(xiàn)有的系統(tǒng)中的執(zhí)行計劃,重點檢查驅(qū)動表與被驅(qū)動表順序、表連接算法、排序是否有索引、索引使用。

3)分析AWR、ASH和ADDM。

4)通過OEM中性能監(jiān)控捕獲5s以上的SQL。

5)通過GV$SQLAREA視圖來分析。[考點]性能診斷

13.

如何計算一個字符在字符串中出現(xiàn)的次數(shù)?正確答案:可以利用REGEXP_COUNT、REGEXP_REPLACE或TRANSLATE系統(tǒng)函數(shù),也可以自定義函數(shù)來計算一個字符在字符串中出現(xiàn)的次數(shù)。[考點]函數(shù)相關

14.

如何快速地清理Oracle的進程?正確答案:若想要快速清理掉Oracle的進程,最直接的辦法是殺pmon進程。有如下3條命令可供選擇,其中加粗的orcl替換成ORACLE_SID的值即可。

kill-9'ps-ef|greporcl|grep-vgrep|awk'{print$2}''

ps-ef|greporcl|grep-vgrep|awk'{print$2}'|xargskill-9

ipcs-m|greporacle|awk'{print$2}'|xargsipcrmshm

若想要快速殺掉集群的進程,則可以執(zhí)行如下命令:

km-9'ps-ef|grepd.bin|grep-vgrep|awk'{print$2}''

注意,生產(chǎn)庫上嚴禁使用,否則可能導致集群不能正常啟動。[考點]會話

15.

MySQL有幾種存儲引擎(表類型)?各自有什么區(qū)別?正確答案:MySQL官方有多種存儲引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。第三方存儲引擎中比較有名的有TokuDB、Infobright、InnfiniDB、XtraDB(InnoDB增強版本)。其中,最常見的兩種存儲引擎是MyISAM和InnoDB。MyISAM是MySQL關系型數(shù)據(jù)庫管理系統(tǒng)的默認存儲引擎(MySQL5.5以前)。這種MySQL表存儲結(jié)構(gòu)從舊ISAM代碼擴展出許多有用的功能。從MySQL5.5開始,InnoDB引擎由于其對事務參照完整性,以及更高的并發(fā)性等優(yōu)點開始逐步地取代MyISAM,作為MySQL數(shù)據(jù)庫的默認存儲引擎。下面逐一介紹各種存儲引擎。

1.MyISAM

MyISAM存儲引擎管理非事務表,提供高速存儲和檢索,以及全文搜索能力。該引擎插入數(shù)據(jù)快,空間和內(nèi)存使用比較低。

(1)存儲組成

每個MyISAM在磁盤上存儲成三個文件。每一個文件的名字就是表的名字,文件名都和表名相同,擴展名指出了文件類型。這里特別要注意的是,MyISAM不緩存數(shù)據(jù)文件,只緩存索引文件。

1)表定義的擴展名為.frm(frame,存儲表定義)。

2)數(shù)據(jù)文件的擴展名為.MYD(MYData,存儲數(shù)據(jù))。

3)索引文件的擴展名是.MYI(MYIndex,存儲索引)。

數(shù)據(jù)文件和索引文件可以放置在不同的目錄,平均分布I/O,獲得更快的速度,而且其索引是壓縮的,能加載更多索引,這樣內(nèi)存使用率就對應提高了不少,壓縮后的索引也能節(jié)約一些磁盤空間。

(2)特點

1)不支持事務,不支持外鍵約束,但支持全文索引,這可以極大地優(yōu)化LIKE查詢的效率。

2)表級鎖定(更新時鎖定整個表):其鎖定機制是表級索引,這雖然可以讓鎖定的實現(xiàn)成本很小,但是也同時大大降低了其并發(fā)性能。MyISAM不支持行級鎖,只支持并發(fā)插入的表鎖,主要用于高負載的查詢。

3)讀寫互相阻塞:不僅會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀本身并不會阻塞另外的讀。

4)不緩存數(shù)據(jù),只緩存索引:MyISAM可以通過key_buffer緩存,以大大提高訪問性能,減少磁盤I/O,但是這個緩存區(qū)只會緩存索引,而不會緩存數(shù)據(jù)。

[root@mysql]#grepkey_bufferf

key_buffer_size=16M

5)讀取速度較快,占用資源相對少。

6)MyISAM引擎是MySQL5.5之前版本缺省的存儲引擎。

7)并發(fā)量較小,不適合大量UPDATE。

(3)適用場景

如果表主要用于插入新記錄和讀出新記錄,那么選擇MyISAM存儲引擎能實現(xiàn)處理的高效率。如果應用的完整性和并發(fā)性要求很低,那么也可以選擇MyISAM存儲引擎。它是在Web、數(shù)據(jù)倉儲和其他應用環(huán)境下最常使用的存儲引擎之一。具體來說,適用于以下場景:

1)不需要事務支持的業(yè)務,一般為讀數(shù)據(jù)比較多的網(wǎng)站應用。

2)并發(fā)相對較低的業(yè)務(純讀純寫高并發(fā)也可以)。

3)數(shù)據(jù)修改相對較少的業(yè)務。

4)以讀為主的業(yè)務,例如,WWW、BLOG、圖片信息數(shù)據(jù)庫、用戶數(shù)據(jù)庫、商品數(shù)據(jù)庫等業(yè)務。

5)對數(shù)據(jù)一致性要求不是非常高的業(yè)務。

6)中小型網(wǎng)站的部分業(yè)務。

小結(jié):單一對數(shù)據(jù)庫的操作都可以使用MyISAM,所謂單一就是盡量純讀,或純寫(INSERT,UPDATE,DELETE)等。生產(chǎn)建議:沒有特別需求,一律用InnoDB。

(4)MyISAM引擎調(diào)優(yōu)精要

1)盡量索引(緩存機制)。

2)調(diào)整讀寫優(yōu)先級,根據(jù)實際需要確保重要操作更優(yōu)先。

3)啟用延遲插入改善大批量寫入性能(降低寫入頻率,盡可能多條數(shù)據(jù)一次性寫入)。

4)盡量順序操作讓INSERT數(shù)據(jù)都寫入尾部,減少阻塞。

5)分解大的操作,降低單個操作的阻塞時間。

6)降低并發(fā)數(shù),某些高并發(fā)場景通過應用進行排隊機制。

7)對于相對靜態(tài)的數(shù)據(jù),充分利用QueryCache可以極大地提高訪問效率。

[root@mysql3307]#grepqueryf

query_cache_size=2M

query_cache_limit=1M

query_cache_min_res_unit=2k

這幾個參數(shù)都是MySQL自身緩存設置。

8)MyISAM的COUNT只有在全表掃描的時候特別高效,帶有其他條件的COUNT都需要進行實際的數(shù)據(jù)訪問。

9)把主從同步的主庫使用InnoDB,從庫使用MyISAM引擎。

2.InnoDB

InnoDB用于事務處理應用程序,主要面向OLTP方面的應用。該引擎由InnoDB公司開發(fā),其特點是行鎖設置,并支持類似于Oracle的非鎖定讀,即默認情況下讀不產(chǎn)生鎖。InnoDB將數(shù)據(jù)放在一個邏輯表空間中。InnoDB通過多版本并發(fā)控制來獲得高并發(fā)性,實現(xiàn)了ANSI標準的4種隔離級別,默認為Repeatable,使用一種被稱為next-keylocking的策略避免幻讀。對于表中數(shù)據(jù)的存儲,InnoDB采用類似Oracle索引組織表Clustered的方式進行存儲。如果對事務的完整性要求比較高,要求實現(xiàn)并發(fā)控制,那么選擇InnoDB引擎有很大的優(yōu)勢。需要頻繁地進行更新,刪除操作的數(shù)據(jù)庫,也可以選擇InnoDB存儲引擎。因為InnoDB存儲引擎提供了具有提交(COMMIT)、回滾(ROLLBACK)和崩潰恢復能力的事務安全。

InnoDB類型的表只有ibd文件,分為數(shù)據(jù)區(qū)和索引區(qū),有較好的讀寫并發(fā)能力。物理文件有日志文件、數(shù)據(jù)文件和索引文件。其中,索引文件和數(shù)據(jù)文件是放在一個目錄下,可以設置共享文件、獨享文件兩種格式。

(1)特點

1)支持事務:包括ACID事務支持,支持4個事務隔離級別,支持多版本讀。

2)行級鎖定(更新時一般是鎖定當前行):通過索引實現(xiàn),全表掃描仍然會是表鎖,注意間隙鎖的影響。

3)支持崩潰修復能力和MVCC。

4)讀寫阻塞與事務隔離級別相關。

5)具有非常高效的緩存特性:能緩存索引,也能緩存數(shù)據(jù)。

6)整個表和主鍵以CLUSTER方式存儲,組成一棵平衡樹。

7)所有SECONDARYINDEX都會保存主鍵信息。

8)支持分區(qū)、表空間,類似Oracle數(shù)據(jù)庫。

9)支持外鍵約束(ForeignKey),外鍵所在的表稱為子表,而所依賴的表稱為父表。

10)InnoDB支持自增長列(AUTO_INCREMENT),自增長列的值不能為空。

11)InnoDB是索引和數(shù)據(jù)緊密捆綁的,沒有使用壓縮,從而會造成InnoDB比MyISAM體積龐大得多。

(2)優(yōu)點

支持事務,用于事務處理應用程序,具有眾多特性,包括ACID事務支持,支持外鍵,同時支持崩潰修復能力和并發(fā)控制。并發(fā)量較大,適合大量UPDATE。

(3)缺點

對比MyISAM的存儲引擎,InnoDB寫的處理效率差一些,并且會占用更多的磁盤空間以保留數(shù)據(jù)和索引。相比MyISAM引擎,InnoDB引擎更消耗資源,速度沒有MyISAM引擎快。

(4)適用場景

如果對事務的完整性要求比較高,要求實現(xiàn)并發(fā)控制,那么選擇InnoDB引擎有很大的優(yōu)勢。需要頻繁地進行更新,刪除操作的數(shù)據(jù)庫,也可以選擇InnoDB存儲引擎。具體分類如下:

1)需要事務支持(具有較好的事務特性)。

2)行級鎖定對高并發(fā)有很好的適應能力,但需要確保查詢是通過索引完成。

3)數(shù)據(jù)更新較為頻繁的場景,例如,BBS(BulletinBoardSystem,電子公告牌系統(tǒng))、SNS(SocialNetworkSite,社交網(wǎng))等。

4)數(shù)據(jù)一致性要求較高的業(yè)務。例如,充值、銀行轉(zhuǎn)賬等。

5)硬件設備內(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帶來過大的空間負擔。

2)避免全表掃描,因為會使用表鎖。

3)盡可能緩存所有的索引和數(shù)據(jù),提高響應速度,減少磁盤I/O消耗。

4)在執(zhí)行大量插入操作的時候,盡量自己控制事務而不要使用AUTOCOMMIT自動提交。有開關可以控制提交方式。

5)合理設置innodb_flush_log_at_trx_commit參數(shù)值,不要過度追求安全性。

6)避免主鍵更新,因為這會帶來大量的數(shù)據(jù)移動。

3.MEMORY(HEAP)

MEMORY存儲引擎(之前稱為HEAP)提供“內(nèi)存中”的表。如果需要很快的讀寫速度,對數(shù)據(jù)的安全性要求較低,那么可選擇MEMORY存儲引擎。MEMORY存儲引擎對表大小有要求,不能建太大的表。所以,這類數(shù)據(jù)庫只適用相對較小的數(shù)據(jù)庫表。如果mysqld進程發(fā)生異常,那么數(shù)據(jù)庫就會重啟或崩潰,數(shù)據(jù)就會丟失,因此,MEMORY存儲引擎中的表的生命周期很短,一般只使用一次,非常適合存儲臨時數(shù)據(jù)。

(1)特點

1)MEMORY存儲引擎將所有數(shù)據(jù)保存在內(nèi)存(RAM)中,在需要快速查找引用和其他類似數(shù)據(jù)的環(huán)境下,可提供極快的訪問速度。

2)每個基于MEMORY存儲引擎的表實際對應一個磁盤文件,該文件的文件名和表名是相同的,類型為.frm。該文件只存儲表的結(jié)構(gòu),而其數(shù)據(jù)文件都是存儲在內(nèi)存中,這樣有利于對數(shù)據(jù)的快速處理,提高整個表的處理能力。

3)MEMORY存儲引擎默認使用哈希(HASH)索引,其速度比使用B-Tree型要快,但安全性不高。如果希望使用B-Tree型,那么在創(chuàng)建的時候可以引用。

(2)適用場景

如果需要很快的讀寫速度,那么在需要快速查找引用和其他類似數(shù)據(jù)的環(huán)境下,對數(shù)據(jù)的安全性要求較低,可選擇MEMORY存儲引擎。

(3)優(yōu)點

將所有數(shù)據(jù)保存在內(nèi)存(RAM)中,默認使用HASH索引,數(shù)據(jù)的處理速度快。

(4)缺點

不支持事務,安全性不高;MEMORY存儲引擎對表大小有要求,不能建太大的表。

4.MERGE

MERGE存儲引擎允許將一組使用MyISAM存儲引擎的并且表結(jié)構(gòu)相同(即每張表的字段順序、字段名稱、字段類型、索引定義的順序及其定義的方式必須相同)的數(shù)據(jù)表合并為一個表,方便了數(shù)據(jù)的查詢。需要注意的是,使用MERGE“合并”起來的表結(jié)構(gòu)相同的表最好不要有主鍵,否則會出現(xiàn)這種情況:一共有兩個成員表,其主鍵在兩個表中存在相同情況,但是寫了一條按相同主鍵值查詢的SQL語句,這時只能查到UNION列表中第一個表中的數(shù)據(jù)。MERGE存儲引擎允許集合將被處理同樣的MyISAM表作為一個單獨的表。

適用場景:MERGE存儲引擎允許MySQLDBA或開發(fā)人員將一系列等同的MyISAM表以邏輯方式組合在一起,并作為1個對象引用它們。對于諸如數(shù)據(jù)倉庫等,VLDB(VeryLargeDataBase,超大型數(shù)據(jù)庫)環(huán)境十分適合。

優(yōu)點:便于同時引用多個數(shù)據(jù)表而無須發(fā)出多條查詢。

缺點:不支持事務。

5.BDB(BerkeleyDB)

BDB是事務型存儲引擎,支持COMMIT、ROLLBACK和其他事務特性,它由××軟件公司(http://www.***.com)開發(fā)。BDB是一個高性能的嵌入式數(shù)據(jù)庫編程庫(引擎),它可以用來保存任意類型的鍵/值對(Key/ValuePair),而且可以為一個鍵保存多個數(shù)據(jù)。BDB可以支持數(shù)干的并發(fā)線程同時操作數(shù)據(jù)庫,支持最大256TB的數(shù)據(jù)。BDB存儲引擎處理事務安全的表,并以哈希為基礎的存儲系統(tǒng)。

適用場景:BDB存儲引擎適合快速地讀寫某些數(shù)據(jù),特別是不同KEY的數(shù)據(jù)。

優(yōu)點:支持事務。

缺點:在沒有索引的列上操作速度很慢。

6.EXAMPLE

EXAMPLE存儲引擎是一個“存根”引擎,可以用這個引擎創(chuàng)建表,但數(shù)據(jù)不能存儲在該引擎中。EXAMPLE存儲引擎可為快速創(chuàng)建定制的插件式存儲引擎提供幫助。

7.NDB

NDB存儲引擎是一個集群存儲引擎,是被MySQLCluster用來實現(xiàn)分割到多臺計算機上的表的存儲引擎,類似于Oracle的RAC,但它是ShareNothing的架構(gòu),因此,能提供更高級別的高可用性和可擴展性。NDB的特點是數(shù)據(jù)全部放在內(nèi)存中,因此,通過主鍵查找非常快。它在MySQL-Max5.1二進制分發(fā)版里提供。

(1)特性

1)分布式:分布式存儲引擎,可以由多個NDBCluster存儲引擎組成集群分別存放整體數(shù)據(jù)的一部分。

2)支持事務:和InnoDB一樣,支持事務。

3)可與mysqld不在一臺主機:可以和mysqld分開存在于獨立的主機上,然后通過網(wǎng)絡和mysqld通信交互。

4)內(nèi)存需求量巨大:新版本索引以及被索引的數(shù)據(jù)必須存放在內(nèi)存中,老版本所有數(shù)據(jù)和索引必須存在于內(nèi)存中。

(2)適用場景

1)具有非常高的并發(fā)需求。

2)對單個請求的響應并不是非常嚴格。

3)查詢簡單,過濾條件較為固定,每次請求數(shù)據(jù)量較少。

4)具有高性能查找要求的應用程序,這類查找需求還要求具有最高的正常工作時間和可用性。

(3)優(yōu)點

1)分布式:分布式存儲引擎,可以由多個NDBCluster存儲引擎組成集群分別存放整體數(shù)據(jù)的一部分。

2)支持事務:和InnoDB一樣,支持事務。

3)可與mysqld不在一臺主機:可以和mysqld分開存在于獨立的主機上,然后通過網(wǎng)絡和mysqld通信交互。

(4)缺點

內(nèi)存需求量巨大:新版本索引以及被索引的數(shù)據(jù)必須存放在內(nèi)存中,老版本所有數(shù)據(jù)和索引必須存在于內(nèi)存中。它的連接操作是在MySQL數(shù)據(jù)庫層完成,不是在存儲引擎層完成的,這意味著,復雜的連接操作需要巨大的網(wǎng)絡開銷,查詢速度會很慢。

8.ARCHIVE

ARCHIVE存儲引擎只支持INSERT和SELECT操作,其設計的主要目的是提供高速的插入和壓縮功能。

適用場景:ARCHIVE非常適合存儲歸檔數(shù)據(jù),如日志信息。

優(yōu)點:ARCHIVE存儲引擎被用來無索引地、非常小地覆蓋存儲的大量數(shù)據(jù)。為大量很少引用的歷史、歸檔或安全審計信息的存儲和檢索提供了完美的解決方案。

缺點:不支持事務,只支持INSERT和SELECT操作。

9.CSV

CSV存儲引擎把數(shù)據(jù)以逗號分隔的格式存儲在文本文件中。

10.BLACKHOLE

BLACKHOLE存儲引擎接收但不存儲數(shù)據(jù),并且檢索總是返回一個空集。用于臨時禁止對數(shù)據(jù)庫的應用程序輸入。該存儲引擎支持事務,而且支持MVCC的行級鎖,主要用于日志記錄或同步歸檔。

11.FEDERATED

FEDERATED存儲引擎不存放數(shù)據(jù),它至少指向一臺遠程MySQL數(shù)據(jù)庫服務器上的表,該存儲引擎把數(shù)據(jù)存在遠程數(shù)據(jù)庫中,非常類似于Oracle的透明網(wǎng)關。在MySQL5.1中,它只和MySQL一起工作,使用MySQLCClientAPI。在未來的分發(fā)版中,想要讓它使用其他驅(qū)動器或客戶端連接方法連接到另外的數(shù)據(jù)源。該存儲引擎能夠?qū)⒍鄠€分離的MySQL服務器連接起來,從多個物理服務器創(chuàng)建一個邏輯數(shù)據(jù)庫,十分適合于分布式環(huán)境或數(shù)據(jù)集市環(huán)境。

12.ISAM

最原始的存儲引擎就是ISAM,它管理著非事務性表,后來被MyISAM代替了,而且MyISAM是向后兼容的,因此可以忘記這個ISAM存儲引擎。

可以在MySQL中使用顯示引擎的命令得到一個可用引擎的列表,如下:

上面查詢結(jié)果顯示了可用的數(shù)據(jù)庫引擎的全部名單以及在當前的數(shù)據(jù)庫服務器中是否支持這些引擎。

下面的表格列出了一些常見的比較重要的存儲引擎。

16.

SCN與時間戳如何相互轉(zhuǎn)換?正確答案:一個SCN值總是發(fā)生在某一個特定的時刻,只不過由于粒度的不一樣,通常會存在多個SCN對應同一個時間戳的情況。Oracle10g提供了兩個新函數(shù)用于SCN和時間戳進行相互轉(zhuǎn)換,這兩個函數(shù)分別是SCN_TO_TIMESTAMP和TIMESTAMP_TO_SCN,通過對SCN和時間戳進行轉(zhuǎn)換,極大方便了Oracle的很多備份和恢復過程。

1)SCN_TO_TIMESTAMP(scn_number):將SCN轉(zhuǎn)換成時間戳。

2)TIMESTAMP_TO_SCN(timestamp):將時間戳轉(zhuǎn)換成SCN。

通過以上這兩個函數(shù),最終Oracle將SCN和時間的關系建立起來。在Oracle10g之前,是沒有辦法通過函數(shù)轉(zhuǎn)換得到SCN和時間的對應關系的,一般可以通過LogMiner分析日志獲得。但是這兩種函數(shù)轉(zhuǎn)換要依賴于數(shù)據(jù)庫內(nèi)部表SMON_SCN_TIME,對于久遠的SCN則不能轉(zhuǎn)換。[考點]RMAN

17.

文件b.txt,每行以“:”符分成5列,如“1:app

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論