MySQL 面試題目

 

 

1, mysql的複製原理以及流程。mysql

(1)先問基本原理流程,3個線程以及之間的關聯。sql

 

 

 

 

 

 

(2)再問一致性,延時性,數據恢復。數據庫

 

 

(3)再問各類工做遇到的複製bug的解決方法緩存



2,mysql中myisam與innodb的區別,至少5點。

(1) 問5點不一樣服務器

 

1>.InnoDB支持事物,而MyISAM不支持事物網絡

2>.InnoDB支持行級鎖,而MyISAM支持表級鎖架構

3>.InnoDB支持MVCC, 而MyISAM不支持併發

4>.InnoDB支持外鍵,而MyISAM不支持分佈式

5>.InnoDB不支持全文索引,而MyISAM支持。(X)函數


(2) 問各類不一樣mysql版本的2者的改進
(3)2者的索引的實現方式

3,問mysql中varchar與char的區別以及varchar(50)中的30表明的涵義。

(1)varchar與char的區別

        char是一種固定長度的類型,varchar則是一種可變長度的類型

(2)varchar(50)中50的涵義

         最多存放50個字符

(3)int(20)中20的涵義

         int(M)中的M indicates the maximum display width (最大顯示寬度)for integer types. The maximum legal display width is 255.

(4)爲何MySQL這樣設計?

      

 


4,問了innodb的事務與日誌的實現方式。 

(1)有多少種日誌

錯誤日誌:記錄出錯信息,也記錄一些警告信息或者正確的信息

慢查詢日誌:設置一個閾值,將運行時間超過該值的全部SQL語句都記錄到慢查詢的日誌文件中。

二進制日誌:記錄對數據庫執行更改的全部操做

查詢日誌:記錄全部對數據庫請求的信息,不論這些請求是否獲得了正確的執行。

 

(2)日誌的存放形式

 

(3)事務是如何經過日誌(undo log ,redo log)來實現的,說得越深刻越好。

隔離性: 經過 鎖 實現

原子性、一致性和持久性是經過 redo和undo來完成的。

 



5,問了mysql binlog的幾種日誌錄入格式以及區別

(1)各類日誌格式的涵義

(2)適用場景

(3)結合第一個問題,每一種日誌格式在複製中的優劣。



6,問了下mysql數據庫cpu飆升到500%的話他怎麼處理?

(1) 沒有經驗的,能夠不問

(2)有經驗的,問他們的處理思路



7,sql優化。

(1)explain出來的各類item的意義

(2)profile的意義以及使用場景。

(3)explain中的索引問題。


8, 備份計劃,mysqldump以及xtranbackup的實現原理,

(1) 備份計劃

(2)備份恢復時間

(3)備份恢復失敗如何處理



9, 500臺db,在最快時間以內重啓。


10, 在當前的工做中,你碰到到的最大的mysql db問題是?


11, innodb的讀寫參數優化

(1)讀取參數,global buffer pool以及 local buffer

(2)寫入參數

(3)與IO相關的參數

(4)緩存參數以及緩存的適用場景

 

12 ,請簡潔地描述下MySQL中InnoDB支持的四種事務隔離級別名稱,以及逐級之間的區別?

SQL標準定義的四個隔離級別爲:

read uncommited  :讀到未提交數據

read committed   :髒讀,不可重複讀

repeatable read   :

serializable          :串行事物

 

 

Read Uncommitted(讀取未提交內容)

      在該隔離級別,全部事務均可以看到其餘未提交事務的執行結果。本隔離級別不多用於實際應用,由於它的性能也不比其餘級別好多少。讀取未提交的數據,也被稱之爲髒讀(Dirty Read)。

Read Committed(讀取提交內容)

      這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它知足了隔離的簡單定義:一個事務只能看見已經提交事務所作的改變。這種隔離級別也支持所謂的不可重複讀(Nonrepeatable Read),由於同一事務的其餘實例在該實例處理其間可能會有新的commit,因此同一select可能返回不一樣結果。

Repeatable Read(可重讀)

      這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到一樣的數據行。不過理論上,這會致使另外一個棘手的問題:幻讀(Phantom Read)。簡單的說,幻讀指當用戶讀取某一範圍的數據行時,另外一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的「幻影」 行。InnoDB和Falcon存儲引擎經過多版本併發控制(MVCC,Multiversion Concurrency Control 間隙鎖)機制解決了該問題。注:其實多版本只是解決不可重複讀問題,而加上間隙鎖(也就是它這裏所謂的併發控制)才解決了幻讀問題。

Serializable(可串行化)

這是最高的隔離級別,它經過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每一個讀的數據行上加上共享鎖。在這個級別,可能致使大量的超時現象和鎖競爭。

       

對於不一樣的事務,採用不一樣的隔離級別分別有不一樣的結果。不一樣的隔離級別有不一樣的現象。主要有下面3種如今:

一、髒讀(dirty read):一個事務能夠讀取另外一個還沒有提交事務的修改數據。

二、非重複讀(nonrepeatable read):在同一個事務中,同一個查詢在T1時間讀取某一行,在T2時間從新讀取這一行時候,這一行的數據已經發生修改,可能被更新了(update),也可能被刪除了(delete)。

三、幻像讀(phantom read):在同一事務中,同一查詢屢次進行時候,因爲其餘插入操做(insert)的事務提交,致使每次返回不一樣的結果集。

不一樣的隔離級別有不一樣的現象,並有不一樣的鎖定/併發機制,隔離級別越高,數據庫的併發性就越差,4種事務隔離級別分別表現的現象以下表:


 

隔離級別 髒讀 非重複讀 幻像讀
read uncommitted 容許 容許 容許
read committed   容許 容許
repeatable read     容許
serializable      

 


 

 

 

 

13,表中有大字段X(例如:text類型),且字段X不會常常更新,以讀爲爲主,請問

(1)您 是選擇拆成子表,仍是繼續放一塊兒?

(2)寫出您這樣選擇的理由?


14,MySQL中InnoDB引擎的行鎖是經過加在什麼上完成(或稱實現)的?爲何是這樣子的

 

 

15  MyISAM 與innodb的區別

 

 

1.      MySQL中控制內存分配的全局參數,有哪些?(注:至少寫6個以上)

1>. Key_buffer_size

2>. innodb_buffer_pool_size

3>. innodb_additional_memory_pool_size

4>. innodb_log_buffer_size

5>. query_cache_size

6>.read_buffer_size

7>.read_rnd_buffer_size

 

2.      請簡潔地描述下MySQL中InnoDB支持的四種事務隔離級別名稱,以及逐級之間區別?

Read uncommitted: 在該隔離級別,全部事務均可以看到其餘未提交的事務的執行結果。讀取未提交的事務,稱之爲「髒讀」。

Read Committed:一個事務只能看見已經提交事務所作的改變。由於同一事務的其餘實例在該實例處理其間可能會有新的commit,因此同一select可能返回不一樣結果。

Repeatable Read:這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到一樣的數據行。這種級別會出現幻讀。

Serializable:這是最高的隔離級別,它經過強制事務排序,使之不可能相互衝突,從而解決幻讀問題

 

 

 

它們之間的區別以下表:

隔離級別

髒讀

非重複讀

幻像讀

Read uncommitted

容許

容許

容許

Read Committed

 

容許

容許

Repeatable Read

 

 

容許

Serializable

 

 

 

 

 

 

 

 

3.      小題集錦

1>.VARCHAR(N) 或 CHAR(N)中的N含義是:

N的含義表示N個字節。前者是變長,N的範圍是 0~65535,後者是固定長度,N的範圍是0~255。

 

2>.若一張表中只有一個字段VARCHAR(N)類型,utf8編碼,則N最大值爲多少(精確到數量級便可):

因爲utf8的每一個字符最多佔用3個字節。而MySQL定義行的長度不能超過65535,所以N的最大值計算方法爲:(65535-1-2)/3。減去1的緣由是實際存儲從第二個字節開始,減去2的緣由是由於要在列表長度存儲實際的字符長度,除以3是由於utf8限制:每一個字符最多佔用3個字節。

所以N=(Floor(65535-1-2)/3)

 

3>.表中有大字段X(例如:text類型),且字段X不會常常更新,以讀爲爲主,請問您

是選擇拆成子表,仍是繼續放一塊兒,而且寫出您的理由?

答案:拆成子表

 

理由:能夠提升其餘字段查詢和更新的效率,由於每頁保存的行數越多,效率會越高。大字段X更新率低,單行讀取時效率影響不大。但若是讀取的行數越多,影響會越大。所以選擇拆成子表更好。

 

4>.MySQL中InnoDB引擎的行鎖是經過加在什麼上完成(或稱實現)的:

A.     數據塊

B.     索引值

 

選擇答案後,告訴咱們爲何?

答:B。innodb表數據是索引組織表形式存放

    

     5>.username字段定義爲VARCHAR(40)和VARCHAR(200)有啥區別?

       答:臨時表varchar(200)佔用空間更大

 

5>.MySQL數據庫備份方式有那幾種(只討論InnoDB存儲引擎),至少寫四種。

1>.熱備份

   2>.冷備份

   3>.溫備份

   4>.二進制日誌備份

  

  

4.      MySQL複製搭建M->N的過程,請簡述各個步驟?(備註:M已經在線跑,N爲新安裝的MySQL服務器)

1> .在啓動主從服務器時,必須用server_id啓動選項給出其ID值。主從服務器的ID值不能相同。主服務器啓動二進制日誌。

2>.在主服務器上,建立一個帳戶供從服務器鏈接主服務器並請求修改信息。

3>.鏈接到主服務器並經過執行showmaster status 語句肯定當前的複製座標。

4>.在從服務器上爲將被複制的數據庫創建一份完備的副本。

5>.鏈接到從服務器並使用changemaster 語句來配置它,包括把用來鏈接主服務器的參數和初始化複製座標告訴從服務器。

6>.從服務器開始複製。

 

5.      看圖分析(申明:應用程序未有任何版本變動)

 

1>.圖出現什麼樣的現象,及現象之間的關聯性?

圖一表示當前處於鎖等待的事務數從07:30到09:30急劇增長。圖二表示當前等待寫入到磁盤的數據量在19:00到01:00之間很是多,並在22:00達到峯值。

之間的聯繫:圖二是因,圖一是果。

 

 

2>.經過圖信息分析得出可能什麼緣由形成的?

服務器宕機

 

3>.分析出緣由後,告知如何解決?

答:宕機的緣由太多。要查看數據庫日誌文件和操做系統日誌來具體分析。

 

4>.請簡述你是如何思考分析的?

答:兩幅圖的之間的關係要從時間軸來分析,考慮來龍去脈。

 

 

6.      SQL語句優化

原SQL語句:

SELECTID,WAYBILL_NO,EXP_TYPE,PKG_QTY,EXPRESS_CONTENT_CODE,EFFECTIVE_TYPE_CODE

FROM T_EXP_OP WHERE ORDERID NOT IN(SELECTORDERID FROM T_EXP_OP WHERE AUX_OP_CODE IN ('NEW','UPDATE','DELETE') AND((OP_CODE IN (176, 162, 171, 131, 136)AND EXP_TYPE IN ('10', '20', '30')) OR(OP_CODE IN (191, 121)AND EXP_TYPE IN ('10', '20')) OR (OP_CODE IN (181,111)AND EXP_TYPE = '10'))) LIMIT 10;

 

條件:

T_EXP_OP表主鍵爲BIGINT類型的ID字段,存儲引擎爲InnoDB,無其餘索引

 

優化後爲(提示:優化成一條簡單的SQL語句,即無子查詢,無JOIN關聯):

SELECT ID, WAYBILL_NO, EXP_TYPE, PKG_QTY,EXPRESS_CONTENT_CODE, EFFECTIVE_TYPE_CODE

FROM T_EXP_OP

WHERE

           AUX_OP_CODENOT IN (‘NEW’, ‘UPDATE’, ‘DELETE’)

           AND(OP_CODE NOT IN (176, 162, 171, 131, 136, 191, 121, 181,111)

           ANDEXP_TYPE NOT IN(‘10’, ‘20’, ‘30’))

LIMIT 10;

 

 

 

7.      分頁SQL語句優化

原SQL語句:

SELECT * FROM test FORCE(idx_m_n) WHEREm=1 ORDER BY n LIMIT 1000,10;

 

條件:

Test表爲InnoDB存儲引擎,主鍵爲BIGINT類型的ID字段,二級索引:idx_m_n(m,n)

優化後爲:

索引要修改成: idx_m_n(m,n,ID); 

SELECT a.* FROM test a

inner join

(SELECT ID FROM test FORCE(idx_m_n) WHEREm=1 ORDER BY n LIMIT 1000,10 ) b

on a.id=b.id

 

請簡述優化的理由:

1>.二級索引中沒有ID字段,沒法達到最優化

2>.採用多表鏈接,效率會更高

3>.

 

8.      語句挑錯

SQL語句:

SELECTM.columnname……,N.* columnname…..

FROMleft_table M  LEFT JOIN right_tableN

ON M.columnname_join=N. columnname_join  ANDN. columnname=XXX AND M.columnname=XXX

 

請問本SQL語句哪裏不合理,爲啥不合理?

答:N.* columnname….. 應該改成N.columnname……

空格符有明顯錯誤,如:M.  columnname_join應改成:M.columnname_join,N.columnname_join, N. columnname同理。

 

9.      [SELECT *] 和[SELECT 所有字段]的2種寫法有何優缺點,至少寫出四點

1>.前者要解析數據字典,後者不須要

   2>.結果輸出順序,前者與建表列順序相同,後者按指定字段順序。

   3>.表字段更名,前者不須要修改,後者須要改

   4>.後者能夠創建索引進行優化,前者沒法優化

   5>.後者的可讀性比前者要高

  

10.  HAVNG 子句 和 WHERE的異同點,至少寫出3點

1>.語法上:where 用表中列名,having用select結果別名

2>.影響結果範圍:where從表讀出數據的行數,having返回客戶端的行數

3>.索引:where 可使用索引,having不能使用索引,只能在臨時結果集操做

4>.where後面不能使用匯集函數,having是專門使用匯集函數的。

 

11.  分佈式數據庫產品的特色(至少寫4條)

1>.數據分佈在多個異地點,抗災性強

2>.併發性高

3>.受網絡影響很大

4>.單機的性能不是特別重要,可是整體成本很高。

5>.擴展性強

 

12.  數據拆分架構的優缺點(至少寫8條)

1>.透明性,程序不須要作任何修改

2>.解決集中數據庫的擴展侷限性。實現水平擴展問題,涉及到數據的拆分問題

3>.提升數據庫服務的性能、可靠性、可用性

4>.實現技術不難,開發成本和維護成本可控

5>.測試成本高

6>.沒法支持分佈式事務

7>.數據拆分後數據合併難

8>.部分功能限制

9>.擴展受限

相關文章
相關標籤/搜索