MySOL程序員面試分類模擬題4_第1頁
MySOL程序員面試分類模擬題4_第2頁
MySOL程序員面試分類模擬題4_第3頁
MySOL程序員面試分類模擬題4_第4頁
MySOL程序員面試分類模擬題4_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

MySOL程序員面試分類模擬題4一、簡答題1.

如何查看創(chuàng)建的索引及索引類型等信息?正確答案:可以通過以下命令查看:SHOWINDEXFROM<tablename>。

INCLUDE(江南博哥)PICTURE\d":8089/YFB12/tu/2201/j/cm/my1.D20300.jpg"INET

mysql>SHOWINDEXFROMTEST\G;

**************************1.row**************************

Table:test

Non_unique:0

Key_name:PRIMARY

Seq_in_index:1

Column_name:id

Collation:A

Cardinality:5

Sub_part:NULL

Packed:NULL

NUll:

Index_type:BTREE

Comment:

Index_comment:**************************2.row**************************

Table:test

Non_unique:1

Key_name:index_name

Seq_in_index:1

Column_name:name

Collation:A

Cardinality:5

Sub_part:NULL

Packed:NULL

Ninll:

Index_type:BTREE

Comment:

Index_comment:**************************3.row**************************

Table:test

Non_unique:1

Key_name:shouji

Seq_in_index:1

Column_name:shouji

Colalion:A

Cardinalilty:5

Sub_part:8

Packed:NULL

Null:YES

Index_type:BTREE

Comment:

Index_comment:3rowsinset(0.00sec)

2.

MySQL支持事務嗎?正確答案:在默認模式下,MySQL是AUTOCOMMIT模式的,所有的數(shù)據(jù)庫更新操作都會即時提交。這就表示除非顯式地開始一個事務,否則每個查詢都被當作一個單獨的事務自動執(zhí)行。但是,如果MySQL的表類型使用的是InnoDBTables(或其他支持事務的存儲引擎)的話,那么MySQL就可以使用事務處理,使用SETAUTOCOMMIT=0就可以使MySQL運行在非AUTOCOMMIT模式下。在非AUTOCOMMIT模式下,必須使用COMMIT來提交更改,或者使用ROLLBACK來回滾更改。需要注意的是,在MySQL5.5以前,默認的存儲引擎是MyISAM(從MySQL5.5開始,默認存儲引擎是InnoDB),而MyISAM存儲引擎不支持事務處理,若改變AUTOCOMMIT的值對數(shù)據(jù)庫沒有什么作用,且不會報錯。所以,如果要使用事務處理,那么一定要確定所操作的表是支持事務處理的,如InnoDB。如果不知道表的存儲引擎,那么可以通過查看創(chuàng)建表語句來確定表的存儲引擎。

3.

靜態(tài)鏈接與動態(tài)鏈接有什么區(qū)別?正確答案:靜態(tài)鏈接是指把要調(diào)用的函數(shù)或者過程直接鏈接到可執(zhí)行文件中,成為可執(zhí)行文件的一部分。換句話說,函數(shù)和過程的代碼就在程序的.exe文件中,該文件包含了運行時所需的全部代碼。靜態(tài)鏈接的缺點是當多個程序都調(diào)用相同函數(shù)時,內(nèi)存中就會存在這個函數(shù)的多個復制,這樣就浪費了內(nèi)存資源。

動態(tài)鏈接是相對于靜態(tài)鏈接而言的,動態(tài)鏈接所調(diào)用的函數(shù)代碼并沒有被復制到應用程序的可執(zhí)行文件中去,而是僅僅在其中加入了所調(diào)用函數(shù)的描述信息(往往是一些重定位信息)。僅當應用程序被裝入內(nèi)存開始運行時,在操作系統(tǒng)的管理下,才在應用程序與相應的動態(tài)鏈接庫(dynamiclinklibrary,簡稱dll)之間建立鏈接關(guān)系。當要執(zhí)行所調(diào)用.dll文件中的函數(shù)時,根據(jù)鏈接產(chǎn)生的重定位信息,操作系統(tǒng)才轉(zhuǎn)去執(zhí)行.dll文件中相應的函數(shù)代碼。

靜態(tài)鏈接的執(zhí)行程序能夠在其他同類操作系統(tǒng)的機器上直接運行。例如,一個.exe文件是在Windows2000系統(tǒng)上靜態(tài)鏈接的,那么將該文件直接復制到另一臺Windows2000的機器上,是可以運行的。而動態(tài)鏈接的執(zhí)行程序則不可以,除非把該.exe文件所需的dll文件都一并復制過去,或者對方機器上也有所需的相同版本的.dll文件,否則是不能保證程序正常運行的。

4.

基本的HTTP流程有哪些?正確答案:HTTP是HyperTextTransferlProtocol(超文本傳輸協(xié)議)的縮寫,其主要負責服務器與瀏覽器之間的通信。HTTP把客戶端瀏覽器的請求發(fā)送到服務器,并把響應的網(wǎng)頁內(nèi)容由服務器返回到客戶端瀏覽器。

一次完整的HTTP流程一般包括以下幾個步驟:

1)打開HTTP連接。因為HTTP是一種無狀態(tài)協(xié)議,所以每一個請求都需要建立一個新的連接。

2)初始化方法請求。包含一些類型的方法指示符,它們用來描述調(diào)用什么方法和需要什么參數(shù)。

3)設(shè)置HTTP請求頭。包含要傳輸?shù)臄?shù)據(jù)類型和數(shù)據(jù)長度。

4)發(fā)送請求。即將二進制流寫入服務器。

5)讀取請求。調(diào)用目標servet程序,并接受HTTP請求數(shù)據(jù)。如果該次請求為客戶端第一次請求,則需要創(chuàng)建一個新的服務器對象實例。

6)調(diào)用方法。提供了服務器端調(diào)用對象的方法。

7)初始化響應方法。如果調(diào)用的方法出現(xiàn)異常,客戶將會收到出錯信息;否則,發(fā)送返回類型。

8)設(shè)置HTTP響應頭。響應頭中設(shè)置待發(fā)送的數(shù)據(jù)類型與長度。

9)發(fā)送響應。服務器端發(fā)送二進制數(shù)據(jù)流給客戶端作為響應。

10)關(guān)閉連接。當響應結(jié)束后,與服務器必須斷開連接,以保證其他請求能夠與服務器建立連接。

5.

Cache替換算法有哪些?正確答案:數(shù)據(jù)可以存放在CPU或者內(nèi)存中。CPU處理速度快,但是容量少;內(nèi)存容量大,但是轉(zhuǎn)交給CPU處理的速度慢。為此,需要Cache(緩存)來做一個折中。將最有可能調(diào)用的數(shù)據(jù)先從內(nèi)存調(diào)入Cache,CPU再從Cache讀取數(shù)據(jù),這樣會快許多。然而,Cache中所存放的數(shù)據(jù)不是全部有用的。CPU從Cache中讀取到有用數(shù)據(jù)稱為“命中”。

由于主存中的塊比Cache中的塊多,所以當要從主存中調(diào)一個塊到Cache中時,會出現(xiàn)該塊所映射到的一組(或一個)Cache塊已全部被占用的情況。此時,需要被迫騰出其中的某一塊,以接納新調(diào)入的塊,這就是替換。

Cache替換算法有RAND算法、FIFO算法、LRU算法、OPT算法和LFU算法。

(1)隨機(RAND)算法

隨機算法就是用隨機數(shù)發(fā)生器產(chǎn)生一個要替換的塊號,將該塊替換出去,此算法簡單、易于實現(xiàn),而且它不考慮Cache塊過去、現(xiàn)在及將來的使用情況。但是由于沒有利用上層存儲器使用的“歷史信息”、沒有根據(jù)訪存的局部性原理,故不能提高Cache的命中率,命中率較低。

(2)先進先出(FIFO)算法

先進先出(FirstInFirstOut,F(xiàn)TFO)算法是將最先進入Cache的信息塊替換出去。FIFO算法按調(diào)入Cache的先后決定淘汰的順序,選擇最早調(diào)入Cache的字塊進行替換,它不需要記錄各字塊的使用情況,比較容易實現(xiàn),系統(tǒng)開銷小,其缺點是可能會把一些需要經(jīng)常使用的程序塊(如循環(huán)程序)也作為最早進入Cache的塊替換掉,而且沒有根據(jù)訪存的局部性原理,故不能提高Cache的命中率。因為最早調(diào)入的信息可能以后還要用到,或者經(jīng)常要用到,如循環(huán)程序。此法簡單、方便,利用了主存的“歷史信息”,但并不能說最先進入的就不經(jīng)常使用,其缺點是不能正確反映程序局部性原理,命中率不高,可能出現(xiàn)一種異?,F(xiàn)象。例如,Solar—16/65機Cache采用組相連方式,每組4塊,每塊都設(shè)定一個兩位的計數(shù)器,當某塊被裝入或被替換時該塊的計數(shù)器清0,而同組的其他各塊的計數(shù)器均加1,當需要替換時就選擇將計數(shù)值最大的塊替換掉。

(3)近期最少使用(LRU)算法

近期最少使用(Least,RecentlyUsed,LRU)算法是將近期最少使用的Cache中的信息塊替換出去。

LRU算法是依據(jù)各塊使用的情況,總是選擇那個最近最少使用的塊被替換。這種方法雖然比較好地反映了程序局部性規(guī)律,但是這種替換方法需要隨時記錄Cache中各塊的使用情況,以便確定哪個塊是近期最少使用的塊。LRU算法相對合理,但實現(xiàn)起來比較復雜,系統(tǒng)開銷較大。通常需要對每一塊設(shè)置一個稱為計數(shù)器的硬件或軟件模塊,用以記錄其被使用的情況。

實現(xiàn)LIU策略的方法有多種,例如計數(shù)器法、寄存器棧法及硬件邏輯比較法等,下面簡單介紹計數(shù)器法的設(shè)計思路。

計數(shù)器方法:緩存的每一塊都設(shè)置一個計數(shù)器。計數(shù)器的操作規(guī)則如下:

1)被調(diào)入或者被替換的塊,其計數(shù)器清“0”,而其他的計數(shù)器則加“1”。

2)當訪問命中時,所有塊的計數(shù)值與命中塊的計數(shù)值要進行比較,如果計數(shù)值小于命中塊的計數(shù)值,則該塊的計數(shù)值加“1”;如果塊的計數(shù)值大于命中塊的計數(shù)值,則數(shù)值不變。最后將命中塊的計數(shù)器清“0”。

3)需要替換時,則選擇計數(shù)值最大的塊被替換。

(4)最優(yōu)替換(OPT)算法

使用最優(yōu)替換(OPTimalreplacement,OPT)算法時必須先執(zhí)行一次程序,統(tǒng)計Cache的替換情況。有了這樣的先驗信息,在第二次執(zhí)行該程序時便可以用最有效的方式來替換,以達到最優(yōu)的目的。

前面介紹的幾種頁面替換算法主要是以主存儲器中頁面調(diào)度情況的歷史信息為依據(jù)的,它假設(shè)將來主存儲器中的頁面調(diào)度情況與過去一段時間內(nèi)主存儲器中的頁面調(diào)度情況是相同的,顯然,這種假設(shè)不總是正確的。最好的算法應該是選擇將來最久不被訪問的頁面作為被替換的頁面,這種替換算法的命中率一定是最高的,它就是最優(yōu)替換算法。

要實現(xiàn)OPT算法,唯一的辦法是讓程序先執(zhí)行一遍,記錄下實際的頁地址的使用情況。根據(jù)這個頁地址的使用情況才能找出當前要被替換的頁面。顯然,這樣做是不現(xiàn)實的。因此,OPT算法只是一種理想化的算法,然而它也是一種很有用的算法。實際上,經(jīng)常把這種算法用來作為評價其他頁面替換算法好壞的標準。在其他條件相同的情況下,哪一種頁面替換算法的命中率與OPT算法最接近,那么它就是一種比較好的頁面替換算法。

(5)近期最少使用(LFU)算法

近期最少使用(LeastFrequentlyUsed,LFU)算法選擇近期最少訪問的頁面作為被替換的頁面。顯然,這是一種非常合理的算法,因為到目前為止最少使用的頁面,很可能也是將來最少訪問的頁面。該算法既充分利用了主存中頁面調(diào)度情況的歷史信息,又正確反映了程序的局部特性。但是,這種算法實現(xiàn)起來非常困難,它要為每個頁面設(shè)置一個很長的計數(shù)器,并且要選擇一個固定的時鐘為每個計數(shù)器定時計數(shù)。在選擇被替換頁面時,要從所有計數(shù)器中找出一個計數(shù)值最大的計數(shù)器。

6.

常用的網(wǎng)絡安全防護措施有哪些?正確答案:計算機網(wǎng)絡由于分布式特性,使得它容易受到來自網(wǎng)絡的攻擊。網(wǎng)絡安全是指“在一個網(wǎng)絡環(huán)境里,為數(shù)據(jù)處理系統(tǒng)建立和采取的技術(shù)與管理的安全保護,利用網(wǎng)絡管理控制和技術(shù)措施保護計算機軟件、硬件數(shù)據(jù)不因為偶然或惡意的原因而遭到破壞、更改和泄露”。常見的網(wǎng)絡安全防護措施有加密技術(shù)、驗證碼技術(shù)、認證技術(shù)、訪問控制技術(shù)、防火墻技術(shù)、網(wǎng)絡隔離技術(shù)、入侵檢測技術(shù)、防病毒技術(shù)、數(shù)據(jù)備份與恢復技術(shù)、VPN技術(shù)、安全脆弱性掃描技術(shù)、網(wǎng)絡數(shù)據(jù)存儲、備份及容災規(guī)劃等。

(1)加密技術(shù)

數(shù)據(jù)在傳輸過程中有可能因攻擊者或入侵者的竊聽而失去保密性。加密技術(shù)是最常用的保密安全手段之一,它對需要進行偽裝的機密信息進行變換,得到另外一種看起來似乎與原有信息不相關(guān)的表示。合法用戶可以從這些信息中還原出原來的機密信息,而非法用戶如果試圖從這些偽裝后的信息中分析出原有的機密信息,要么這種分析過程根本是不可能實現(xiàn)的,要么代價過于巨大,以至于無法進行。

(2)驗證碼技術(shù)

普遍的客戶端交互,如留言本、會員注冊等僅是按照要求輸入內(nèi)容,但網(wǎng)絡上有很多非法應用軟件,如注冊機,可以通過瀏覽Internet,掃描表單,然后在系統(tǒng)上頻繁注冊,頻繁發(fā)送不良信息,造成不良的影響,或者通過軟件不斷地嘗試,盜取用戶密碼。而通過使用驗證碼技術(shù),使客戶端輸入的信息都必須經(jīng)過驗證,從而可以有效解決別有用心的用戶利用機器人(或惡意軟件)自動注冊、自動登錄、惡意增加數(shù)據(jù)庫訪問、用特定程序暴力破解密碼等問題。

所謂驗證碼是指將一串隨機產(chǎn)生的數(shù)字或符號生成一幅圖片,圖片里加上一些干擾像素,由用戶肉眼極易識別其中的驗證碼信息,輸入表單提交網(wǎng)絡應用程序驗證,驗證成功后才能使用某項功能。放在會員注冊、留言本等所有客戶端提交信息的頁面,要提交信息,必須要輸入正確的驗證碼,從而可以防止不法用戶用軟件頻繁注冊、頻繁發(fā)送不良信息等。

使用驗證碼技術(shù)必須保證所有客戶端交互部分都輸入驗證碼,測試提交信息時不輸入驗證碼,或者故意輸入錯誤的驗證碼,如果信息都不能提交,說明驗證碼有效,同時在驗證碼輸入正確下提交信息,如果能提交,說明驗證碼功能已完善。

(3)認證技術(shù)

認證技術(shù)是信息安全的一項重要內(nèi)容,很多情況下,用戶并不要求信息保密,只要確認網(wǎng)絡服務器或在線用戶不是假冒的,自己與他們交換的信息未被第三方修改或偽造,且網(wǎng)上通信是安全的。

認證是指核實真實身份的過程,是防止主動攻擊的重要技術(shù)之一,是一種可靠地證實被認證對象(包括人和事)是否名副其實或者是否有效的過程,因此也稱為鑒別或驗證。認證技術(shù)的作用主要是通過一定的手段在網(wǎng)絡上弄清楚對象是誰,具有什么樣的特征(特征具有唯一性)。認證可以是某個個人、某個機構(gòu)代理、某個軟件(如股票交易系統(tǒng)),這樣可以確定對象的真實性,防止假冒、篡改等行為。

(4)訪問控制技術(shù)

網(wǎng)絡中擁有各種資源,通??梢允潜徽{(diào)用的程序、進程,要存取的數(shù)據(jù)、信息,要訪問的文件、系統(tǒng),或者是各種各樣的網(wǎng)絡設(shè)備,如打印機、硬盤等。網(wǎng)絡中的用戶必須根據(jù)自己的權(quán)限范圍來訪問網(wǎng)絡資源,從而保證網(wǎng)絡資源受控地、合法地使用。

訪問控制是在身份認證的基礎(chǔ)上針對越權(quán)使用資源的防范(控制)措施,是網(wǎng)絡安全防范和保護的主要策略。其主要任務是防止網(wǎng)絡資源被非法使用、非法訪問和不慎操作所造成破壞。它也是維護網(wǎng)絡系統(tǒng)安全、保護網(wǎng)絡資源的重要手段。

實現(xiàn)訪問控制的關(guān)鍵是采用何種訪問控制策略。目前主要有3種不同類型的訪問控制策略:自主訪問控制(DAC)、強制訪問控制(MAC)和基于角色的訪問控制(RBAC)。目前DAC應用最多,主要采用訪問控制表(ACL)實現(xiàn),如ApacheWeb服務器、JDK開發(fā)平臺都支持ACL。

此外,在路由器的許多其他配置任務中都需要使用訪問控制列表,如網(wǎng)絡地址轉(zhuǎn)換、按需撥號路由、路由重分布、策略路由等很多場合都需要訪問控制列表。訪問控制列表從概念上來講并不復雜,復雜的是對它的配置和使用,許多初學者往往在使用訪問控制列表時出現(xiàn)錯誤。

除了上述提及的網(wǎng)絡安全技術(shù)外,其他常見的安全技術(shù)還有防火墻技術(shù)、網(wǎng)絡隔離技術(shù)、入侵檢測技術(shù)、防病毒技術(shù)、數(shù)據(jù)備份與恢復技術(shù)、VPN(VirtualPrivateNetwork,虛擬專用網(wǎng)絡)技術(shù)、安全脆弱性掃描技術(shù)、物理安全技術(shù)、虛擬網(wǎng)絡技術(shù)、漏洞掃描技術(shù)、主機防護技術(shù)、安全評估技術(shù)、安全審計技術(shù)、加強行政管理、完善規(guī)章制度、嚴格選任人員和法律介入等。但是沒有一種安全技術(shù)可以完美解決網(wǎng)絡上的所有安全問題,各種安全技術(shù)必須相互關(guān)聯(lián),相互補充,形成網(wǎng)絡安全的立體縱深、多層次防御體系。

7.

事務的概念及其4個特性是什么?正確答案:事務(Transaction)是一個操作序列。這些操作要么都做,要么都不做,是一個不可分割的工作單位。事務通常以BEGINTRANSACTION開始,以COMMIT或ROLLBACK操作結(jié)束,COMMIT即提交,提交事務中所有的操作、事務正常結(jié)束。ROLLBACK即回滾,撤銷已做的所有操作,回滾到事務開始時的狀態(tài)。事務是數(shù)據(jù)庫系統(tǒng)區(qū)別于文件系統(tǒng)的重要特性之一。

對于事務可以舉一個簡單的例子:轉(zhuǎn)賬,有A和B兩個用戶,A用戶轉(zhuǎn)100到B用戶,如下所示:

A:>支出100,則A-100

B:>收到100,則B+100

A>B轉(zhuǎn)賬,對應如下SQL語句:

UPDATEACCOUNTSETMONEY=MONEY-100WHERENAME='A';

UPDATEACCOUNTSETMONEY=MONEY+100WHERENAME='B';

事務有4個特性,一般都稱之為ACID特性,簡單記為原一隔持(諧音:愿意各吃,即愿意各吃各的),如下表所示:

名稱簡介舉例原子性(Atomicity)所謂原子性是指事務在邏輯上是不可分割的操作單元,其所有語句要么都執(zhí)行,要么都撤銷執(zhí)行。當每個事務運行結(jié)束時,可以選擇“提交”所做的數(shù)據(jù)修改,并將這些修改永久應用到數(shù)據(jù)庫中假設(shè)有兩個賬號,A賬號和B賬號。A賬號轉(zhuǎn)給B賬號100元,這里有兩個動作在里面,①A賬號減去100元,②B賬號增加100元,這兩個動作不可分割即原子性一致性(Consistency)事務是一種邏輯上的工作單元。一個事務就是一系列在邏輯上相關(guān)的操作指令的集合,用于完成一項任務,其本質(zhì)是將數(shù)據(jù)庫中的數(shù)據(jù)從一種一致性狀態(tài)轉(zhuǎn)換到另一種一致性狀態(tài),以體現(xiàn)現(xiàn)實世界中的狀況變化。至于數(shù)據(jù)處于什么樣的狀態(tài)算是一致狀態(tài),這取決于現(xiàn)實生活中的業(yè)務邏輯以及具體的數(shù)據(jù)庫內(nèi)部實現(xiàn)拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務結(jié)束后兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性隔離性(Isolation)隔離性是針對并發(fā)事務而言的,所謂并發(fā)是指數(shù)據(jù)庫服務器同時處理多個事務,如果不采取專門的控制機制,那么并發(fā)事務之間可能會相互干擾,進而導致數(shù)據(jù)出現(xiàn)不一致或錯誤的狀態(tài)。隔離性就是要隔離并發(fā)運行的多個事務間的相互影響。關(guān)于事務的隔離性,數(shù)據(jù)庫提供了多種隔離級別,后面的章節(jié)會介紹隔離性即要達到這么一種效果:對于任意兩個并發(fā)的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務都感覺不到有其他事務在并發(fā)地執(zhí)行持久性(Durability)事務的持久性(也叫永久性)是指一旦事務提交成功,其對數(shù)據(jù)的修改是持久性的。數(shù)據(jù)更新的結(jié)果已經(jīng)從內(nèi)存轉(zhuǎn)存到外部存儲器上,此后即使發(fā)生了系統(tǒng)故障,已提交事務所做的數(shù)據(jù)更新也不會丟失當開發(fā)人員在使用JDBc(JavaDataBaseConnectivity時,Java數(shù)據(jù)庫連接)操作數(shù)據(jù)庫時,在提交事務后,提示用戶事務操作完成,那么這個時候數(shù)據(jù)就已經(jīng)存儲在磁盤上了。即使數(shù)據(jù)庫重啟,該事務所做的更改操作也不會丟失

8.

MysQL數(shù)據(jù)庫有什么特點?正確答案:MySQL是一個小型的關(guān)系型數(shù)據(jù)庫,開發(fā)者為瑞典MySQLAB公司,現(xiàn)在已經(jīng)被Oracle收購,它支持FreeBSD、Linux、MAC、Windows等多種操作系統(tǒng)。MySQL數(shù)據(jù)庫可支持要求最苛刻的Web、電子商務和聯(lián)機事務處理(OLTP)應用程序。它是一個全面集成、事務安全、符合ACID的數(shù)據(jù)庫,具備全面的提交、回滾、崩潰恢復和行級鎖定功能。MySQL憑借其易用性、擴展力和性能,成為全球最受歡迎的開源數(shù)據(jù)庫。全球許多流量最大的網(wǎng)站都依托于MySQL來支持其業(yè)務關(guān)鍵的應用程序,其中,包括Facebook、Google、Ticketmaster和eBay。MySQL5.6顯著提高了性能和可用性,可支持下一代Web、嵌入式和云計算應用程序。

MySQL被設(shè)計為一個單進程多線程架構(gòu)的數(shù)據(jù)庫(通過“ps-Lfmysqld進程號”或“pstackmysqld進程號”可以查看多線程結(jié)構(gòu)),這點與SQLSever類似,但與Oracle多進程的架構(gòu)有所不同(Oracle的Windows版本也屬于單進程多線程架構(gòu))。這也就是說,MySQL數(shù)據(jù)庫實例在系統(tǒng)上的表現(xiàn)就是一個進程。

MySQL主要有以下優(yōu)點:

●可以處理擁有上千萬條記錄的大型數(shù)據(jù)。

●支持常見的SQL語句規(guī)范。

●可移植性高,安裝簡單小巧。

●良好的運行效率,有豐富信息的網(wǎng)絡支持。

●調(diào)試、管理,優(yōu)化簡單(相對其他大型數(shù)據(jù)庫)。

●復制全局事務標識可支持自我修復式集群。

●復制無崩潰從機可提高可用性。

●復制多線程從機可提高性能。

●對InnoDB進行NoSQL訪問,可快速完成鍵值操作以及快速提取數(shù)據(jù)來完成大數(shù)據(jù)部署。

●在Linux上的性能提升高達230%。

●在當今的多核、多CPU硬件上具備更高的擴展力。

●InnoDB性能改進,可更加高效地處理事務和只讀負載。

●更快速地執(zhí)行查詢命令,具備增強的診斷功能。

●PerformanceSchema可監(jiān)視各個用戶和應用程序的資源占用情況。

●通過基于策略的密碼管理和實施來確保安全性。

●復制功能支持靈活的拓撲架構(gòu),可實現(xiàn)向外擴展和高可用性。

●分區(qū)有助于提高性能和管理超大型數(shù)據(jù)庫環(huán)境。

●ACID事務支持構(gòu)建安全可靠的關(guān)鍵業(yè)務應用程序。

●InformationSchema有助于方便地訪問元數(shù)據(jù)。

●插入式存儲引擎架構(gòu)可最大限度發(fā)揮靈活性。

9.

查看當前使用的配置文件f的方法和步驟有哪些?正確答案:MySQL實例在啟動時,會先讀取配置參數(shù)文件/etc/f。在安裝MySQL后,系統(tǒng)中會有多個f文件,有些是用于測試的。使用“l(fā)ocatef”或“find/-namef”命令可以列出所有的f文件。

有時候,DBA會發(fā)現(xiàn)雖然嘗試修改了配置文件的一些變量,但是并沒有生效,這其實是因為修改的文件并非MySQL服務器讀取的配置文件。在Linux環(huán)境中,MySQL服務器讀取的配置文件及路徑默認為:

/etc/f/etc/mysql/f/usr/etc/f~/.f

如果不清楚MySQL當前使用的配置文件路徑,那么可以按照如下步驟來查看:

1.查看是否使用了指定目錄的f文件

在啟動MySQL后,可以通過查看MySQL的進程,看看是否有設(shè)置使用指定目錄的f文件,如果有則表示MySQL啟動時是加載了這個配置文件。

命令:ps-ef|grepmysql|grep'f'

如果上面的命令沒有輸出,那么表示沒有設(shè)置使用指定目錄的f,若有輸出則表示使用的是輸出中的文件。

2.查看MySQL默認讀取f的目錄

如果沒有設(shè)置使用指定目錄的f,那么表示MySQL啟動時會讀取安裝目錄根目錄及默認目錄下的f文件。

命令:mysql→help|grep'f'或mysqld→verbose→help|grep-A1'Defaultoptions'

一般情況下,“/etc/f、/etc/mysql/f、/usr/local/etc/f、~/.f”就是MySQL默認會搜尋f的目錄,順序排前的優(yōu)先。

3.啟動時沒有使用配置文件

如果沒有設(shè)置使用指定目錄f文件及默認讀取目錄沒有f文件,那么表示MySQL啟動時并沒有加載配置文件,而是使用默認配置。若需要修改配置,則可以在MySQL默認讀取的目錄中,創(chuàng)建一個f文件(例如:/etc/f),把需要修改的配置內(nèi)容寫入,重啟MySQL后即可生效。

如果是Windows安裝版,那么找到相關(guān)的Windows服務,會看到配置了一個文件地址:

若此處沒有看到配置文件地址,則表示使用的是默認目錄下的f文件。

10.

MySQL中如何在表的指定位置添加列?正確答案:如果想在一個已經(jīng)建好的表中添加一列,那么可以用以下語句實現(xiàn):

altertableTABLE_NAMEaddcolumnNEW_COLUMN_NAMEvarchar(20)notnull;

這條語句會向已有的表中加入新的一列,這一列在表的最后一列位置。如果希望添加在指定的一列,可以用AFTER關(guān)鍵詞:

altertableTABLE_NAMEaddcolumnNEW_COLUMN_NAMEvarchar(20)notnullafterCOLUMN_NAME;

注意,上面這個命令的意思是添加新列到某一列后面。如果想添加到第一列的話,那么可以用FIRST:

altertableTABLE_NAMEaddcolumnNEW_COLUMN_NAMEvarcbar(20)notnullfirst;

可以使用SQL語句“altertableai3addid0intauto_incrementprimarykeyfirst;”來添加主鍵列??梢允褂肧QL語句“altertableai4modifyidintauto_incrementprimarykey;”來修改主鍵列。

11.

常見的SQLHint(提示)有哪些?正確答案:Oracle的Hint功能種類很多,對于優(yōu)化SQL語句提供了很多方法。同樣,在MySQL里,也有類似的Hint功能,下面介紹一些常用的功能。

關(guān)鍵詞簡介示例USEINDEX提供希望MySQL去參考的索引列表SELECT*FROMTABLE1USEINDEX(FIELD1)...FORCEINDEX強制索引,只使用指定列上的索引,而不使用其他字段上的索引SELECT*FROMTABLE1FORCEINDEX(FIELD1)...IGNOREINDEX忽略索引,可以忽略一個或多個指定的索引SELECT*FROMTABLE1IGNOREINDEX(FIELD1,FIELD2)...SQL_NO_CACHE關(guān)閉查洵緩沖,有一些SQL語句需要實時地查詢數(shù)據(jù),或者并不經(jīng)常使用(可能一天就執(zhí)行一兩次),這樣就需要把緩沖關(guān)了,不管這條SQL語句是否被執(zhí)行過,服務器都不會在緩沖區(qū)中查找,每次都會執(zhí)行它SELECTSQL_NO_CACHEfield1,field2FROMTABLE1;SQL_CACHE強制查詢緩沖,如果在f配置文件中將query_cache_type設(shè)成2,那么只有在使用了SQL_CACHE后,才能使用查詢緩沖SELECTSQL_CALHE*FROMTABLE1;HIGH_PRIORITY優(yōu)先操作,可以使用在SELECT和INSERT操作中,讓MySQL知道,這個操作優(yōu)先進行SELECTHIGH_PRIORITY*FROMTABLE1;LOW_PRIORITY滯后操作,可以使用在INSERT、UPDATE、DELETE和SELECT操作中,讓MySQL知道,這個操作滯后updateLOW_PRIORITYtable1setfield1=wherefield1=...INSERTDELAYED延時插入,INSERTDELAYEDINTO,是客戶端提交數(shù)據(jù)給MySQL,MySQL返回OK狀態(tài)給客戶端。而這并不是已經(jīng)將數(shù)據(jù)插入表,而是存儲在內(nèi)存里面等待排隊。當MySQL有空余時,再插入。另一個重要的好處是,來自許多客戶端的插入被集中在一起,并被編寫入一個塊。這比執(zhí)行許多獨立的插入要快很多。壞處是,不能返回自動遞增的ID,以及系統(tǒng)崩潰時,MySQL還沒有柬得及插入數(shù)據(jù)的話.這止匕數(shù)據(jù)將會丟失INSERTDELAYEDINTOtable1setfield1=...STRAIGHT_JOIN強制連接順序,通過STRAIGHT_JOIN強迫MySQL按TABLE1、TABLE2的順序連接表。如果你認為按自己的順序比MySQL推薦的順序進行連接的效率高的話,就可以通過STRAIGHT_JOIN來確定連接順序SELECTTABLE1.FIELD1,TABLE2.FIELD2FROMTABLE1STRAIGHT_JOINTABLE2WHERE...SQL_BUFFER_RESULT強制使用臨時表,當查詢的結(jié)果集中的數(shù)據(jù)比較多時,可以通過SQL_BUFFER_RESULT選項強制將結(jié)果集放到臨時表中,這樣就可以很快地釋放MySQL的表鎖(這樣其他的SQL語句就可以對這些記錄進行查詢了),并且可以長時間地為客戶端提供大記錄集SELECTSQL_BUFFER_RESULT*FROMTABLE1WHERE...SQL_BIG_RESULT和SQL_SMALL_RESULT分組使用臨時表,一般用于分組或DISTINCT關(guān)鍵字,這個選項通知MySQL,如果有必要,就將查詢結(jié)果放到臨時表中,甚至在臨時表中進行排序。SQL_SMALL_RESULT比起SQL_BIG_RESULT差不多,很少使用SELECTSQL_BIG_RESULTFIELD1,COUNT(*)FROMTABLE1GROUPBYFIELD1;

12.

函數(shù)FROM_UNIXTIME和UNIX_TIMESTAMP的作用分別是什么?正確答案:函數(shù)FROM_UNIXTIME將MySQL中用10位數(shù)字存儲的時間以日期格式來顯示。

語法:FROM_UNIXTIME(unix_timestamp,format),例如:

函數(shù)UNIX_TIMESTAMP返回指定時間的UNIX格式數(shù)字串,即UNIX時間戳(從UTC時間'1970-01-0100:00:00'開始的秒數(shù)),通常為十位,如1344887103。

語法:UNIX_TIMESTAMP(date)

參數(shù):date可能是個DATE字符串,DATETIME字符串,TIMESTAPE字符串,或者是一個類似于YYMMDD或者YYYYMMDD的數(shù)字串。

返回:從UTC時間'1970-01-0100:00:00'開始到該參數(shù)之間的秒數(shù)。服務器將參數(shù)date轉(zhuǎn)化成UTC格式的內(nèi)部時間??蛻舳藙t可以自行設(shè)置當前時區(qū)。當UNIX_TIMESTAMP()用于1個TIMESTAMP列時,函數(shù)直接返回內(nèi)部時間戳的值;如果傳遞1個超出范圍的時間到UNIX_TIMESTAMP(),它的返回值是零。如果date為空,那么將返回從UTC時間'1970-01-0100:00:00'開始到當前時間的秒數(shù)。

13.

使用showprofile分析SQL語句性能消耗正確答案:MySQL可以使用profile分析SQL語句的性能消耗情況。例如,查詢到SQL會執(zhí)行多少時間,并顯示CPU、內(nèi)存使用量,執(zhí)行過程中系統(tǒng)鎖及表鎖的花費時間等信息。

通過have_profiling參數(shù)可以查看MySQL是否支持profile,通過profiling參數(shù)可以查看當前系統(tǒng)profile是否開啟。

查看profile是否開啟方法如下:

以下是有關(guān)profile的一些常用命令:

1)setprofiling=1;#基于會話級別開啟,關(guān)閉則用setprofiling=off。

2)showprofileforquery1;#1是query_id。

3)showprofilecpuforquery1;#查看CPU的消耗情況。

4)showprofilememoryforquery1;#查看內(nèi)存消耗情況。

5)showprofileblockio,cpuforquery1;#查看I/O及CPU的消耗情況。

命令“showprofileforquery”的結(jié)果中有Sendingdata,該狀態(tài)表示MySQL線程開始訪問數(shù)據(jù)行并把結(jié)果返回給客戶端,而不僅僅是返回結(jié)果給客戶端。由于在Sendingdata狀態(tài)下,MySQL線程往往需要做大量的磁盤讀取操作,所以經(jīng)常是整個查詢中耗時最長的狀態(tài)。

可以使用如下的語句查詢SQL的整體消耗百分比:

selectstate,

sum(duration)astotal_r,

round(100*sum(duration)/(selectsum(duration)frominformation_schema.profilingwherequery_id=1),2)aspct_r,

count(*)ascalls,

sum(duration)/count(*)as"r/call"

frominformation_schema.profiling

wherequery_id=1

groupbystate

orderbytotal_rdesc;

profile是一個非常量化的指標,可以根據(jù)這些量化指標來比較各項資源的消耗,有利于對SQL語句的整體把控。在獲取到最消耗時間的線程狀態(tài)后,MySQL支持進一步選擇all、cpu、blockio、contextswitch、pagefaults等明細類型來查看MySQL在使用什么資源上耗費了過多的時間。

可以通過showprofilesourceforquery查看SQL解析執(zhí)行過程中每個步驟對應的源碼的文件、函數(shù)名以及具體的源文件行數(shù):

showprofile能夠在做SQL優(yōu)化時幫助DBA了解時間都耗費到哪里去了,從MySQL5.6開始,可以通過trace文件進一步獲取優(yōu)化器時如何選擇執(zhí)行計劃的。

使用示例如下所示:

1rowinset(0.00sen)

mysql>SETprofiling=1;

QueryOK,0rowsaffected(0.00sec)

mysql>DROPTABLEIFEXISTSt1;

QueryOK,0rowsaffected,1warning(0.00sec)

mysql>CREATETABLET1(idINT);

QueryOK,0rowsaffected(0.01sec)

mysql>SHOWPROFILES;

3rowsinset(0.00sec)

mysql>SHOWPROFILE;

7rowsinset(0.00sec)

mysql>SHOWPROFILEFORQUERY1;

4rowsinset(0.00sen)

mysql>SHOWPROFILECPUFORQUERY2;

需要注意的是,information_filing和SHOWPROFILES在MySQL5.7.2中已經(jīng)被標記為廢除,警告信息為:

'SHOWPROFILES'isdeprecatedandwillberemovedinafuturerelease.PleaseusePerformanceSchemainstead

'INFORMATION_SCHEMA.PROFILING'isdeprecatedandwillberemovedinafuturerelease.PleaseusePerformanceSchemainstead

更詳細的信息,請參加官網(wǎng):

/doc/refman/5.7/en/pefformance-schema-query-profiling.html。

14.

Ping命令是什么?正確答案:Ping(PacketInternetGrope,因特網(wǎng)包探索器)是一個用于測試網(wǎng)絡連接量的程序。它使用的是ICMP,Ping發(fā)送一個ICMP(InternetControlandMessageProtocal,因特網(wǎng)控制報文協(xié)議)請求消息給目的地并報告是否收到所希望的ICMP應答。

ICMP是TCP/IP協(xié)議簇的一個子協(xié)議,用于在IP主機、路由器之間傳遞控制消息。它是用來檢查網(wǎng)絡是否通暢或者網(wǎng)絡連接速度的命令。

由于網(wǎng)絡上的機器都有唯一確定的IP地址,當給目標IP地址發(fā)送一個數(shù)據(jù)包(包括對方的IP地址和自己的地址以及序列數(shù))時,對方就要返回一個同樣大小的數(shù)據(jù)包(包括雙方地址),根據(jù)返回的數(shù)據(jù)包可以確定目標主機的存在,可以初步判斷目標主機的操作系統(tǒng)等。

例如,當執(zhí)行命令“”,通常是通過DNS服務器,如果這里出現(xiàn)故障,則表示DNS服務器的口地址配置不正確或DNS服務器有故障。也可以利用該命令實現(xiàn)域名對IP地址的轉(zhuǎn)換功能。例如,Ping某一網(wǎng)絡地址,出現(xiàn):“Replyfrom09:bytes=32time=31msTTL=48”則表示本地與該網(wǎng)絡地址之間的線路是暢通的;如果出現(xiàn)“Requesttimedout”,則表示此時發(fā)送的小數(shù)據(jù)包不能到達目的地,此種情況可能有兩種原因?qū)е拢谝环N是網(wǎng)絡不通,第二種是網(wǎng)絡連通狀況不佳。此時可以使用帶參數(shù)的Ping來確定是哪一種情況。例如,ping-t-w3000不斷地向目的主機發(fā)送數(shù)據(jù),并且響應時間增大到3000ms,此時如果都是顯示“Requesttimedout”,則表示網(wǎng)絡之間確實不通;如果不是全部顯示“Requesttimedout”則表示此網(wǎng)站還是通的,只是響應時間長或通信狀況不佳。

由于Ping使用的是ICMP,有些防火墻軟件會屏蔽掉ICMP,所以有時候Ping的結(jié)果只能作為參考,Ping不通并不能就一定說明對方IP不存在。但一般而言,在通過Ping進行網(wǎng)絡故障判斷時,如果Ping運行正確,大體上就可以排除網(wǎng)絡訪問層、網(wǎng)卡、Modem的輸入輸出線路、電纜和路由器等存在的故障,從而減小了問題的范圍。

15.

在MySQL中,如何查看表的詳細信息,例如存儲引擎、行數(shù)、更新時間等?正確答案:可以使用SHOWTABLESTATUS獲取表的詳細信息,語法為:

SHOWTABLESTATus

[{FROM|IN}db_name]

[LIKE'pattern'|WHEREexpr]

例如:

1)showtablestatusfromdb_name查詢db_name數(shù)據(jù)庫里所有表的信息。

2)showtablestatusfromdb_namelike'lhrusr'\G;查詢db_name里lhrusr表的信息。

3)showtablestatusfromdb_namelike'uc%'查詢db_name數(shù)據(jù)庫里表名以uc開頭的表的信息。

下面的SQL語句查詢了MySQL數(shù)據(jù)庫中的user表的詳細信息:

mysql>showtablestatusfrommysqllike'user'\G;

**************************1.row**************************

Name:user

Engine:MyISAM

Version:10

Row_format:Dynamic

Rows:7

Avg_row_length:85

Data_length:596

Max_data_length:281474976710655

Index_length:2048

Data_free:0

Auto_increment:NULL

Create_time:2017-08-2518:37:13

Update_time:2017-08-2519:06:01

Check_time:NULL

Collation:utf8_bin

ChecksumNULL

Create_options:

Comment:Usersandglobalprivileges

其中,每列的含義如下表所示:

列名解釋Name表名Engine表的存儲引擎,在MySQL4.1.2之前,該列的名字為TypeVersion表的.frm文件的版本號Row_format行存儲格式(Fixed,Dynamic,Compressed,Redundant,Compact)。對于MyISAM引擎,可以是Dynamic,F(xiàn)ixed或Compressed。動態(tài)行的行長度可變,例如Varchar或Blob類型字段。固定行是指行長度不變,例如Char和Integer類型字段Rows行的數(shù)目。對于非事務性表,這個值是精確的,對于事務性引擎,這個值通常是估算的。例如MylSAM,存儲精確的數(shù)目。對于其他存儲引擎,比如InnoDB,這個值是一個大約的數(shù),與實際值相差可達40%到50%。在這些情況下,可以使用SELECTCOUNT(*)來獲取準確的數(shù)目。對于在information_schema數(shù)據(jù)庫中的表,Rows值為NULLAvg_row_length平均每行包括的字節(jié)數(shù)Data_length表數(shù)據(jù)的大小(和存儲引擎有關(guān))Max_data_length表可以容納的最大數(shù)據(jù)量(和存儲引擎有關(guān))Index_length索引的大小(和存儲引擎有關(guān))Data_free對于MyISAM引擎,標識已分配,但現(xiàn)在未使用的空間,并且包含了已被刪除行的空間Auto_increment下一個Auto_increment的值Create_time表的創(chuàng)建的時間Update_time表的最近更新時間Check_time使用checktable或myisamchk工具檢查表的最近時間Collation表的默認字符集和字符排序規(guī)則Checksum如果啟用,則對整個表的內(nèi)容計算時的校驗和Create_options指表創(chuàng)建時的其他所有選項Comment包含了其他額外信息,對于MyISAM引擎,包含了注釋。對于InnoDB引擎,則保存著InnoDB表空間的剩余空間信息。如果是一個視圖,那么注釋里面包含了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_Schema='mysql'andtable_name='user'\G;

示例:

mysql>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

->W(wǎng)HERETable_Schema='mysql'andtable_name='user'\G;

**************************1.row**************************

table_name:user

Engine:MyISAM

Version:10

Row_format:Dynamic

table_rows:7

Avg_row_length:85

Data_length:596

Max_data_length:281474976710655

Index_length:2048

Data_free:0

Auto_increment:NULL

Create_time:2017-08-2518:37:13

Update_time:2017-08-2519:06:01

Check_time:NULL

table_collation:utf8_bin

Checksum:NULL

Create_options:

table_comment:Usersandglobalprivileges

1rowinset(0.00sec)

16.

TCMP模型是什么?正確答案:TCP/IP(TransmissionControlProtocol/InternetProtocol,傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議)是最基本的Internet協(xié)議,由網(wǎng)絡層的IP與傳輸層的TCP構(gòu)成。現(xiàn)在人們常提到的TCP/IP并不一定是指TCP和IP兩個具體的協(xié)議,而是指的TCP/IP協(xié)議簇。

TCP/IP定義了電子設(shè)備如何連入Internet,以及數(shù)據(jù)如何在它們之間傳輸?shù)臉藴?。它基于四層參考模型,分別是網(wǎng)絡接口層、網(wǎng)際層、傳輸層、應用層,每一層都呼叫它的下一層所提供的網(wǎng)絡來完成自己的需求。

其中網(wǎng)絡接口層負責底層的傳輸,常見的協(xié)議有Ethernet802.3、TokenRing802.5、X.25、HDLC、PPPATM等。網(wǎng)絡層負責不同計算機之間的通信,一般包括IP、ICMP等內(nèi)容。傳輸層提供應用程序間的通信,主要包括格式化信息流、提供可靠傳輸?shù)?。應用層用于向用戶提供應用服務,如電子郵件、遠程登錄等。應用層協(xié)議一般有FTP、TELNET、SMTP等。屬于TCP/IP協(xié)議簇的所有協(xié)議都位于該模型的上面三層。

TCP/IP并不完全符合OSI七層模型,它的每一層都對應于OSI七層模型中的一層或多層,下表展示了TCP/IP四層模型和OSI七層模型對應關(guān)系。

OSI七層網(wǎng)絡模型TCP/IP四層模型對應網(wǎng)絡協(xié)議應用層(Application)應用層TFTP、FTP、NFS、WAIS表示層(Presentation)Telnet、Rlogin、SNMP、Gopher會話層(Session)

SMTP、DNS傳輸層(Transport)傳輸層TCP、UDP網(wǎng)絡層(Network)網(wǎng)際層IP、ICMP、ARP、RARP、AKP、UUCP數(shù)據(jù)鏈路層(DataLink)網(wǎng)絡接口層FDDI、Ethernet,Arpanet、PDN、SLIP、PPP物理層(Physical)IEEE802.1A,IEEE802.2到IEEE802.11

17.

MySQL中CHECK、OPTIMIZE和ANALYZE的作用分別是什么?正確答案:MySQL中分析表(ANALYZE)的主要作用是分析關(guān)鍵字的分布;檢查表(CHECK)的主要作用是檢查表是否存在錯誤;優(yōu)化表(OPTIMIZE)的主要作用是消除刪除或者更新造成的空間浪費。詳細信息見下表:

OPTIMIZE(優(yōu)化)ANALYZE(分析)CHECK(檢查)作用OPTIMIZE可以回收空間、減少碎片、提高I/O。如果已經(jīng)刪除了表的大部分數(shù)據(jù),或者如果已經(jīng)對含有可變長度行的表(含有VARCHAR、BDOB或TEXT列的表)進行了很多更改,那么應使用OPTIMIZETABLE命令對表進行優(yōu)化,將表中的空間碎片進行合并,并且消除由于刪除或者更新造成的空間浪費ANALYZE用于收集優(yōu)化器統(tǒng)計信息,分析和存儲表的關(guān)鍵字分布,分析的結(jié)果可以使數(shù)據(jù)庫系統(tǒng)獲得準確的統(tǒng)計信息,使得SQL能生成正確的執(zhí)行計劃。對于MyISAM表,本語句與使用myisamchk-a作用相當CHECK主要作用是檢查表是否存在錯誤,CHECK也可以檢查視圖是否有錯誤,例如,在視圖定義中視圖引用的表已不存在??梢允褂肦EPAIRTABLE來修復損壞的表語法OPTIMIZE[NO_WRITE_TO_BINLOGLOCAL]TABLEtbl_name[,tbl_name]...ANALYZE[NO_WRITE_TO_BINLOG|LOCAL]TABLEtbl_name[,tbL_name]...CHECKTABLEtbl_name[,tbl_name]...[option]...option={FORUPGRADE|QUICK|FAST|MEDIUM|EXTENDED|CHANGED}舉例OPTIMIZETABLEmysql.user;ANALYZETABLEmysql.user;checktablemysql,user;注意事項OPTIMIZE只對MyISAM、BDB和InnoDB表起作用ANALYZE只對MyISAM、BDB和InnoDB表起作用CHECK只對MyISAM和InnoDB表起作用需要注意以下幾點:

1)對于InnoDB引擎的表來說,通過設(shè)置innodb_file_per_table參數(shù),設(shè)置InnoDB為獨立表空間模式,這樣每個數(shù)據(jù)庫的每個表都會生成一個獨立的ibd文件,用于存儲表的數(shù)據(jù)和索引,這樣可以在一定程度上減輕InnoDB表的空間回收壓力。另外,在刪除大量數(shù)據(jù)后,InnoDB表可以通過altertable但是不修改引擎的方法來回收不用的空間,該操作會重建表:

mysql>altertablecityengine=innodb;

QueryOK,0rowsaffected(0.08sec)

Records:0Duplicates:0Warnings:0

2)ANALYZE、CHECK、OPTIMIZE、ALTERTABLE執(zhí)行期間會對表進行鎖定(數(shù)據(jù)庫系統(tǒng)會對表加一個只讀鎖,在分析期間,只能讀取表中的記錄,不能更新和插入記錄),因此一定要注意在數(shù)據(jù)庫不繁忙的時候執(zhí)行相關(guān)的操作。

3)工具mysqlcheck可以檢查和修復MyISAM表,還可以優(yōu)化和分析表,它集成了MySQL工具中CHECK、REPAIR、ANALYZE和OPTIMIZE的功能。

18.

Oracle和MySQL中的分組(GROUPBY)問題正確答案:Oracle和MySQL中的分組(GROUPBY)區(qū)別

Oracle對于分組(GROUPBY)是嚴格的,所有要SELECT出來的字段必須在GROUPBY后邊出現(xiàn),否則會報錯:“ORA-00979:notaGROUPBYexpression”。而MySQL則不同,如果SELECT出來的字段在GROUPBY后面沒有出現(xiàn),那么會隨機取出一個值,而這樣查詢出來的數(shù)據(jù)不準確,語義也不明確。所以,作者建議在寫SQL語句時,應該給數(shù)據(jù)庫一個非常明確的指令,而不是讓數(shù)據(jù)庫去猜測,這也是寫SQL語句的一個非常良好的習慣。

下面給出一個示例。有一張T_MAX_LHR表,數(shù)據(jù)如下表所示,有3個字段ARTICLE、AUTHOR和PRICE。請選出每個AUTHOR的PRICE最高值的記錄(要包含所有字段)。

ARTICLEAUTHORPRICE0001B3.990002A10.990003C1.690004B19950005A6.96首先給出建表語句:

CREATETABLET_MAX_LHR(ARTICLEVARCHAR2(30),AUTHORVARCHAR2(30),PRICENUMBER);--Oracle

--CREATETABLET_MAX_LHR(ARTICLEVARCHAR(30),AUTHORVARCHAR(30),PRICEFLOAT);--MySQLoracle通用

INSERTINTOT_MAX_LHRVALUES('0001','B',3.99);

INSERTINTOT_MAX_LHRVALUES('0002','A',10.99);

INSERTINTOT_MAX_LHRVALUES('0003','C',1.69);

INSERTINTOT_MAX_LHRVALUES('0004','B',19.95);

INSERTINTOT_MAX_LHRVALUES('0005','A',6.96):

COMMIT;

SELECT*FROMT_MAX_LHR;

在Oracle中的數(shù)據(jù):

在MySQL中的數(shù)據(jù):

分析數(shù)據(jù)后,正確答案應該是:

ARTICLEAUTHORPRICE0002A10.990003C1.690004B19.95對于這個例子,很容易想到的SQL語句如下所示:

SELECTT.ARTICLE,T.AUTHOR,MAX(T.PRICE)FROMT_MAX_LHRTGROUPBYT.AUTHOR;

SELECT*FROMT_MAX_LHRTGROUPBYT.AUTHOR;

在Oracle中執(zhí)行上面的SQL語句會產(chǎn)生報錯:

LHR@orelasm>SELECTTARTICLE,T.AUTHOR,MAX(T.PRICE)FROMT_MAX_LHRTGROUPBYT.AUTHOR;

SELECTT.ARTICLE,T.AUTHOR,MAX(T.PRICE)FROMT_MAX_LHRTGROUPBYT.AUTHOR

*

ERRORatline1;

ORA-00979:notaGROUPBYexpression

LHR@orelasm>SELECT*FROMT_MAX_LHRTGROUPBYT.AUTHOR;

SELECT*FROMT_MAX_LHRTGROUPBYT.AUTHOR

*

ERRORatline1:

ORA-00979:notaGROUPBYexpression

在MySQL中執(zhí)行同樣的SQL語句則不會報錯:

可以看出,在MySQL5.6中,雖然執(zhí)行不報錯,可以查詢出數(shù)據(jù),但是從結(jié)果來看數(shù)據(jù)并不是最終想要的結(jié)果,甚至數(shù)據(jù)是錯亂的。需要注意的是,在MySQL5.7中,執(zhí)行SQL語句“SELECTT.ARTICLE,T.AUTHOR,MAX(T.PRICE)FROMT_MAX_LHRTGROUPBYT.AUTHOR;”會報錯,因為在MySQL5.7中,sql_mode的值中包含了ONLY_FULL_GROUP_BY,含義為對于GROUPBY聚合操作,如果在SELECT中的列沒有在GROUPBY中出現(xiàn),那么將認為這個SQL是不合法的,會拋出錯誤。下面給出幾種正確的寫法(在Oracle和MySQL中均可執(zhí)行):

(1)使用相關(guān)子查詢

(2)使用非相關(guān)子查詢

SELECTT.*

FROMT_MAX_LHRT

JOIN(SELECTNT.AUTHOR,MAX(NT.PRICE)PRICE

FROMT_MAX_LHRNT

GROUPBYNT.AUTHOR)T1

ONT.AUTHOR=T1.AUTHOR

ANDT.PRICE=T1.PRICE

ORDERBYT.ARTICLE;

(3)使用LEFTJOIN語句

SELECTT.*

FROMT_MAX_LHRT

LEFTOUTERJOINT_MAX_LHRT1

ONT.AUTHOR=T1.AUTHOR

ANDT.PRICE<T1.PRICE

WHERET1.ARTICLEISNULL

ORDERBYT.ARTICLE;

在Oracle中的執(zhí)行結(jié)果:

在MySQL中的執(zhí)行結(jié)果:

2.Oracle和MySQL中分組(GROUPBY)后的聚合函數(shù)

在Oracle中,可以用WM_CONCAT函數(shù)或LISTAGG分析函數(shù);在MySQL中可以使用GROUP_CONCAT函數(shù)。示例如下:

首先給出創(chuàng)建表的語句:

CREATETABLET_MAX_LHR(ARTICLEVARCHAR2(30),AUTHORVARCHAR2(30),PRICENUMBER);--Orcle

--CREATETABLET_MAX_LHR(ARTICLEVARCHAR(30),AUTHORVARCHAR(30),PRICEFLOAT);--MySQLoracle通用

INSERTINTOT_MAX_LHRVALUES('0001','B',3.99);

INSERTINTOT_MAX_LHRVALUES('0002','A',10.99);

INSERTINTOT_MAX_LHRVALUES('0003',

溫馨提示

  • 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

提交評論