1, mysql的復制原理以及流程。
(1)先問基本原理流程,3個線程以及之間的關聯。
(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種現在:
1、臟讀(dirty read):一個事務可以讀取另一個尚未提交事務的修改數據。
2、非重復讀(nonrepeatable read):在同一個事務中,同一個查詢在T1時間讀取某一行,在T2時間重新讀取這一行時候,這一行的數據已經發生修改,可能被更新了(update),也可能被刪除了(delete)。
3、幻像讀(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>.擴展受限