1, mysql的複製原理以及流程。mysql
(1)先問基本原理流程,3個線程以及之間的關聯。sql
(2)再問一致性,延時性,數據恢復。數據庫
(3)再問各類工做遇到的複製bug的解決方法緩存
(1) 問5點不一樣服務器
1>.InnoDB支持事物,而MyISAM不支持事物網絡
2>.InnoDB支持行級鎖,而MyISAM支持表級鎖架構
3>.InnoDB支持MVCC, 而MyISAM不支持併發
4>.InnoDB支持外鍵,而MyISAM不支持分佈式
5>.InnoDB不支持全文索引,而MyISAM支持。(X)函數
(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這樣設計?
(1)有多少種日誌
錯誤日誌:記錄出錯信息,也記錄一些警告信息或者正確的信息
慢查詢日誌:設置一個閾值,將運行時間超過該值的全部SQL語句都記錄到慢查詢的日誌文件中。
二進制日誌:記錄對數據庫執行更改的全部操做
查詢日誌:記錄全部對數據庫請求的信息,不論這些請求是否獲得了正確的執行。
(2)日誌的存放形式
(3)事務是如何經過日誌(undo log ,redo log)來實現的,說得越深刻越好。
隔離性: 經過 鎖 實現
原子性、一致性和持久性是經過 redo和undo來完成的。
(1)各類日誌格式的涵義
(2)適用場景
(3)結合第一個問題,每一種日誌格式在複製中的優劣。
(1) 沒有經驗的,能夠不問
(2)有經驗的,問他們的處理思路
(1)explain出來的各類item的意義
(2)profile的意義以及使用場景。
(3)explain中的索引問題。
(1) 備份計劃
(2)備份恢復時間
(3)備份恢復失敗如何處理
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>.擴展受限