做業(yè)務(wù),要懂基本的SQL語句;
做性能優(yōu)化,要懂索引,懂引擎;
做分庫分表,要懂主從,懂讀寫分離...
數(shù)據(jù)庫的使用,是開發(fā)人員的基本功,對它掌握越清晰越深入,你能做的事情就越多。
知識點(diǎn)匯總
1.數(shù)據(jù)庫的不同類型
(1)常用的關(guān)系型數(shù)據(jù)庫
Oracle:功能強(qiáng)大,主要缺點(diǎn)就是貴。
MySQL:互聯(lián)網(wǎng)行業(yè)中最流行的數(shù)據(jù)庫,這不僅僅是因?yàn)镸ySQL的免費(fèi)??梢哉f關(guān)系數(shù)據(jù)庫場景中你需要的功能,MySQL都能很好的滿足,后面詳解部分會詳細(xì)介紹MySQL的一些知識點(diǎn)。
MariaDB:是MySQL的分支,由開源社區(qū)維護(hù),MariaDB雖然被看作MySQL的替代品,但它在擴(kuò)展功能、存儲引擎上都有非常好的改進(jìn)。
PostgreSQL:也叫PGSQL,PGSQL類似于Oracle的多進(jìn)程框架,可以支持高并發(fā)的應(yīng)用場景,PG幾乎支持所有的SQL標(biāo)準(zhǔn),支持類型相當(dāng)豐富。PG更加適合嚴(yán)格的企業(yè)應(yīng)用場景,而MySQL更適合業(yè)務(wù)邏輯相對簡單、數(shù)據(jù)可靠性要求較低的互聯(lián)網(wǎng)場景。
(2)NoSQL數(shù)據(jù)庫(非關(guān)系型數(shù)據(jù)庫)
Redis:提供了持久化能力,支持多種數(shù)據(jù)類型。Redis適用于數(shù)據(jù)變化快且數(shù)據(jù)大小可預(yù)測的場景。
MongoDB:一個(gè)基于分布式文件存儲的數(shù)據(jù)庫,將數(shù)據(jù)存儲為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值對組成。MongoDB比較適合表結(jié)構(gòu)不明確,且數(shù)據(jù)結(jié)構(gòu)可能不斷變化的場景,不適合有事務(wù)和復(fù)雜查詢的場景。
HBase:建立在HDFS,也就是Hadoop文件系統(tǒng)之上的分布式面向列的數(shù)據(jù)庫。類似于谷歌的大表設(shè)計(jì),HBase可以提供快速隨機(jī)訪問海量結(jié)構(gòu)化數(shù)據(jù)。在表中它由行排序,一個(gè)表有多個(gè)列族以及每一個(gè)列族可以有任意數(shù)量的列。HBase依賴HDFS可以實(shí)現(xiàn)海量數(shù)據(jù)的可靠存儲,適用于數(shù)據(jù)量大,寫多讀少,不需要復(fù)雜查詢的場景。
Cassandra:一個(gè)高可靠的大規(guī)模分布式存儲系統(tǒng)。支持分布式的結(jié)構(gòu)化Key-value存儲,以高可用性為主要目標(biāo)。適合寫多的場景,適合做一些簡單查詢,不適合用來做數(shù)據(jù)分析統(tǒng)計(jì)。
Pika:一個(gè)可持久化的大容量類Redis存儲服務(wù), 兼容五種主要數(shù)據(jù)結(jié)構(gòu)的大部分命令。Pika使用磁盤存儲,主要解決Redis大容量存儲的成本問題。
(3)NewSQL數(shù)據(jù)庫(新一代關(guān)系型數(shù)據(jù)庫)
TiDB:開源的分布式關(guān)系數(shù)據(jù)庫,幾乎完全兼容MySQL,能夠支持水平彈性擴(kuò)展、ACID事務(wù)、標(biāo)準(zhǔn)SQL、MySQL語法和MySQL協(xié)議,具有數(shù)據(jù)強(qiáng)一致的高可用特性。既適合在線事務(wù)處理,也適合在線分析處理。
OceanBase:OceanBase是螞蟻金服的數(shù)據(jù)庫,OB是可以滿足金融級的可靠性和數(shù)據(jù)一致性要求的數(shù)據(jù)庫系統(tǒng)。當(dāng)你需要使用事務(wù),并且數(shù)據(jù)量比較大,就比較適合使用OB。不過目前OB已經(jīng)商業(yè)化,不再開源。
2.事物特性及事物類型
后面的詳解知識點(diǎn)會展開介紹
3.數(shù)據(jù)庫的范式
前關(guān)系數(shù)據(jù)庫有六種范式:第一范式、第二范式、第三范式、巴斯-科德范式(BCNF)、第四范式和第五范式。范式級別越高對數(shù)據(jù)表的要求越嚴(yán)格。
第一范式要求最低,只要求表中字段不可用在拆分。
第二范式在第一范式的基礎(chǔ)上要求每條記錄由主鍵唯一區(qū)分,記錄中所有屬性都依賴于主鍵。
第三范式在第二范式的基礎(chǔ)上,要求所有屬性必須直接依賴主鍵,不允許間接依賴。
一般說來,數(shù)據(jù)庫只需滿足第三范式就可以了。
詳解知識點(diǎn)一:數(shù)據(jù)庫事務(wù)
1.數(shù)據(jù)庫事務(wù)特性
數(shù)據(jù)庫的特性是面試時(shí)考察頻率非常高的題目,共4個(gè)特性:
原子性:是指事務(wù)由原子的操作序列組成,所有操作要么全部成功,要么全部失敗回滾。
一致性:是指事務(wù)的執(zhí)行不能破壞數(shù)據(jù)庫數(shù)據(jù)的完整性和一致性,一個(gè)事務(wù)在執(zhí)行之前和執(zhí)行之后,數(shù)據(jù)庫都必須處以一致性狀態(tài)。比如在做多表操作時(shí),多個(gè)表要么都是事務(wù)后新的值,要么都是事務(wù)前的舊值。
隔離性:是指多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),數(shù)據(jù)庫為每個(gè)用戶執(zhí)行的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。事務(wù)的隔離級別我們稍后介紹。
持久性:是指一個(gè)事務(wù)一旦提交并執(zhí)行成功,那么對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
2.事物并發(fā)問題與隔離級別
(1)事務(wù)并發(fā)問題
臟讀:臟讀是指在一個(gè)事務(wù)處理過程里讀取了另一個(gè)未提交的事務(wù)中的數(shù)據(jù),例如,賬戶A轉(zhuǎn)帳給B500元,B余額增加后但事務(wù)還沒有提交完成,此時(shí)如果另外的請求中獲取的是B增加后的余額,這就發(fā)生了臟讀,因?yàn)槭聞?wù)如果失敗回滾時(shí),B的余額就不應(yīng)該增加。
不可重復(fù)讀:不可重復(fù)讀是指對于數(shù)據(jù)庫中某個(gè)數(shù)據(jù),一個(gè)事務(wù)范圍內(nèi)多次查詢返回了不同的數(shù)據(jù)值,這是由于在多次查詢之間,有其他事務(wù)修改了數(shù)據(jù)并進(jìn)行了提交。
幻讀:是指一個(gè)事務(wù)中執(zhí)行兩次完全相同的查詢時(shí),第二次查詢所返回的結(jié)果集跟第一個(gè)查詢不相同。與不可重復(fù)讀的區(qū)別在于,不可重復(fù)讀是對同一條記錄,兩次讀取的值不同。而幻讀是記錄的增加或刪除,導(dǎo)致兩次相同條件獲取的結(jié)果記錄數(shù)不同。
(2)事務(wù)的四種隔離級別
可以用于解決這幾種并發(fā)問題。如圖右面,由上到下的4種隔離級別由低到高。
級別1讀未提交:也就是可以讀取到其他事務(wù)未提交的內(nèi)容,這是最低的隔離級別,這個(gè)隔離級別下,前面提到的三種并發(fā)問題都有可能發(fā)生。
級別2讀已提交:就是只能讀取到其他事務(wù)已經(jīng)提交的數(shù)據(jù)。這個(gè)隔離級別可以解決臟讀問題。
級別3可重復(fù)讀:可以保證整個(gè)事務(wù)過程中,對同數(shù)據(jù)的多次讀取結(jié)果是相同的。這個(gè)級別可以解決臟讀和不可重復(fù)讀的問題。MySQL默認(rèn)的隔離級別就是可重復(fù)讀。
級別4串行化:這是最高的隔離級別,所有事務(wù)操作都依次順序執(zhí)行。這個(gè)級別會導(dǎo)致并發(fā)度下降,性能最差。不過這個(gè)級別可以解決前面提到的所有并發(fā)問題。
3.事務(wù)分類
共分5大類:
扁平化事務(wù):在扁平事務(wù)中,所有的操作都在同一層次,這也是我們平時(shí)使用最多的一種事務(wù)。它的主要限制是不能提交或者回滾事務(wù)的某一部分,要么都成功,要么都回滾。
帶保存點(diǎn)的扁平事務(wù):為了解決第一種事務(wù)的弊端,就有了第二種帶保存點(diǎn)的扁平事務(wù)。它允許事務(wù)在執(zhí)行過程中回滾到較早的狀態(tài),而不是全部回滾。通過在事務(wù)中插入保存點(diǎn),當(dāng)操作失敗后,可以選擇回滾到最近的保存點(diǎn)處。
鏈?zhǔn)聞?wù):可以看做是第二種事務(wù)的變種。它在事務(wù)提交時(shí),會將必要的上下文隱式傳遞給下一個(gè)事務(wù),當(dāng)事務(wù)失敗時(shí)就可以回滾到最近的事務(wù)。不過,鏈?zhǔn)聞?wù)只能回滾到最近的保存點(diǎn),而帶保存點(diǎn)的扁平化事務(wù)是可以回滾到任意的保存點(diǎn)。
嵌套事務(wù):由頂層事務(wù)和子事務(wù)構(gòu)成,類似于樹的結(jié)構(gòu)。一般頂層事務(wù)負(fù)責(zé)邏輯管理,子事務(wù)負(fù)責(zé)具體的工作,子事務(wù)可以提交,但真正提交要等到父事務(wù)提交,如果上層事務(wù)回滾,那么所有的子事務(wù)都會回滾。
分布式事務(wù):是指分布式環(huán)境中的扁平化事務(wù)。
其中,常用的分布式事務(wù)解決方案共4種。XA協(xié)議:是保證強(qiáng)一致性的剛性事務(wù)。實(shí)現(xiàn)方式有兩段式提交和三段式提交。兩段式提交需要有一個(gè)事務(wù)協(xié)調(diào)者來保證所有的事務(wù)參與者都完成了第一階段的準(zhǔn)備工作。如果協(xié)調(diào)者收到所有參與者都準(zhǔn)備好的消息,就會通知所有的事務(wù)執(zhí)行第二階段提交。一般場景下兩段式提交已經(jīng)能夠很好得解決分布式事務(wù)了,然而兩階段在即使只有一個(gè)進(jìn)程發(fā)生故障時(shí),也會導(dǎo)致整個(gè)系統(tǒng)存在較長時(shí)間的阻塞。三段式提交通過增加Pre-commit階段來減少前面提到的系統(tǒng)阻塞的時(shí)間。三段式提交很少在實(shí)際中使用,簡單了解就可以了。
TCC:是滿足最終一致性的柔性事務(wù)方案。TCC采用補(bǔ)償機(jī)制,核心思想是對每個(gè)操作,都要注冊對應(yīng)的確認(rèn)和補(bǔ)償操作。它分為三個(gè)階段:Try階段主要對業(yè)務(wù)系統(tǒng)進(jìn)行檢測及資源預(yù)留;Confirm階段對業(yè)務(wù)系統(tǒng)做確認(rèn)提交。Cancel階段是在業(yè)務(wù)執(zhí)行錯(cuò)誤,執(zhí)行回滾,釋放預(yù)留的資源。
消息事務(wù):第三種方案是消息一致性方案?;舅悸肥菍⒈镜夭僮骱桶l(fā)送消息放在一個(gè)事務(wù)中,保證本地操作和消息發(fā)送要么都成功要么都失敗。下游應(yīng)用訂閱消息,收到消息后執(zhí)行對應(yīng)操作。
GTS/Fescar:阿里云中的全局事務(wù)服務(wù)GTS,對應(yīng)的開源版本是Fescar。Fescar基于兩段式提交進(jìn)行改良,剝離了分布式事務(wù)方案對數(shù)據(jù)庫在協(xié)議支持上的要求。使用Fescar的前提是分支事務(wù)中涉及的資源,必須是支持ACID事務(wù)的關(guān)系型數(shù)據(jù)庫。分支的提交和回滾機(jī)制,都依賴于本地事務(wù)來保障。Fescar的實(shí)現(xiàn)目前還存在一些局限,比如事務(wù)隔離級別最高支持到讀已提交級別。
詳解知識點(diǎn)二:MySQL數(shù)據(jù)庫
1.常用SQL語句需要能手寫常用SQL語句,這里沒有什么特殊的技巧,根據(jù)如圖列出的語句類型多做一些練習(xí)。
2.數(shù)據(jù)類型
要知道MySQL都提供哪些基本都數(shù)據(jù)類型,不同數(shù)據(jù)類型占用的空間大小。
3.MySQL中主要的存儲引擎
MyISAM是MySQL官方提供的存儲引擎,其特點(diǎn)是支持全文索引,查詢效率比較高,缺點(diǎn)是不支持事務(wù)、使用表級鎖。InnoDB在5.5版本后成為了Mysql的默認(rèn)存儲引擎,特點(diǎn)是支持ACID事務(wù)、支持外鍵、支持行級鎖提高了并發(fā)效率。TokuDB是第三方開發(fā)的開源存儲引擎,有非??斓膶懰俣龋С?jǐn)?shù)據(jù)的壓縮存儲、可以在線添加索引而不影響讀寫操作。但是因?yàn)閴嚎s的原因,TokuDB非常適合訪問頻率不高的數(shù)據(jù)或歷史數(shù)據(jù)歸檔,不適合大量讀取的場景。
4.MySQL中的鎖
MyIASAM使用表級鎖,InnoDB使用行級鎖。表鎖開銷小,加鎖快,不會出現(xiàn)死鎖;但是鎖的粒度大,發(fā)生鎖沖突的概率高,并發(fā)訪問效率比較低。行級鎖開銷大,加鎖慢,有可能會出現(xiàn)死鎖,不過因?yàn)殒i定粒度最小,發(fā)生鎖沖突的概率低,并發(fā)訪問效率比較高。
注:
共享鎖也就是讀鎖,其他事務(wù)可以讀,但不能寫。MySQL可以通過Lock In Share Mode語句顯示使用共享鎖。
排他鎖就是寫鎖,其他事務(wù)不能讀取,也不能寫。對于Update、Delete和INSERT語句,InnoDB會自動給涉及的數(shù)據(jù)集加排他鎖,或者使用select for update顯示使用排他鎖。
5.索引
后文重點(diǎn)講解
6.MySQL的存儲過程與函數(shù)
存儲過程和函數(shù)都可以避免開發(fā)人員重復(fù)編寫相同的SQL語句,并且存儲過程和函數(shù)都是在MySQL服務(wù)器中執(zhí)行的,可以減少客戶端和服務(wù)器端的數(shù)據(jù)傳輸。
存儲過程能夠?qū)崿F(xiàn)更復(fù)雜的功能,而函數(shù)一般用來實(shí)現(xiàn)針對性比較強(qiáng)的功能,例如特殊策略求和等。存儲過程可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫操作,而用戶定義函數(shù)不能用于執(zhí)行修改全局?jǐn)?shù)據(jù)庫狀態(tài)的操作。
存儲過程一般是作為一個(gè)獨(dú)立的部分來執(zhí)行,而函數(shù)可以作為查詢語句的一個(gè)部分來調(diào)用。SQL語句中不能使用存儲過程,但可以使用函數(shù)。
不過存儲過程一般與數(shù)據(jù)庫實(shí)現(xiàn)綁定,使用存儲過程會降低程序的可移植性,應(yīng)謹(jǐn)慎使用。
7.新特性
可以了解MySQL8.0的一些新特性,例如默認(rèn)字符集格式改為了UTF8;增加了隱藏索引的功能,隱藏后的索引不會被查詢優(yōu)化器使用,可以使用這個(gè)特性用于性能調(diào)試;支持了通用表表達(dá)式,使復(fù)雜查詢中的嵌入表語句更加清晰;新增了窗口函數(shù)的概念,它可以用來實(shí)現(xiàn)新的查詢方式。窗口函數(shù)與 SUM、COUNT等集合函數(shù)類似,但不會將多行查詢結(jié)果合并,而是將結(jié)果放在多行中。即窗口函數(shù)不需要GROUP BY。
8.MySQL調(diào)優(yōu)
后文重點(diǎn)講解。
MySQL索引
索引可以大幅增加數(shù)據(jù)庫的查詢的性能,在實(shí)際業(yè)務(wù)場景中,或多或少都會使用到。
但是索引是有如下2個(gè)代價(jià)的:
需要額外的磁盤空間來保存索引
對于插入、更新、刪除等操作由于更新索引會增加額外的開銷
因此索引比較適合用在讀多寫少的場景。
1.MySQL索引類型
共分為5類:
唯一索引:就是索引列中的值必須是唯一的,但是允許出現(xiàn)空值。這種索引一般用來保證數(shù)據(jù)的唯一性,比如保存賬戶信息的表,每個(gè)賬戶的id必須保證唯一,如果重復(fù)插入相同的賬戶id時(shí)會MySQL返回異常。
主鍵索引:是一種特殊的唯一索引,但是它不允許出現(xiàn)空值。
普通索引:與唯一索引不同,它允許索引列中存在相同的值。例如學(xué)生的成績表,各個(gè)學(xué)科的分?jǐn)?shù)是允許重復(fù)的,就可以使用普通索引。
聯(lián)合索引:就是由多個(gè)列共同組成的索引。一個(gè)表中含有多個(gè)單列的索引并不是聯(lián)合索引,聯(lián)合索引是對多個(gè)列字段按順序共同組成一個(gè)索引。應(yīng)用聯(lián)合索引時(shí)需要注意最左原則,就是Where查詢條件中的字段必須與索引字段從左到右進(jìn)行匹配。比如,一個(gè)用戶信息表,用姓名和年齡組成了聯(lián)合索引,如果查詢條件是姓名等于張三,那么滿足最左原則;如果查詢條件是年齡大于20,由于索引中最左的字段是姓名不是年齡,所以不能使用這個(gè)索引。
全文索引:前面提到了,MyISAM引擎中實(shí)現(xiàn)了這個(gè)索引,在5.6版本后InnoDB引擎也支持了全文索引,并且在5.7.6版本后支持了中文索引。全文索引只能在CHAR,VARCHAR,TEXT類型字段上使用,底層使用倒排索引實(shí)現(xiàn)。要注意對于大數(shù)據(jù)量的表,生成全文索引會非常消耗時(shí)間也非常消耗磁盤空間。
2.索引實(shí)現(xiàn)
索引實(shí)現(xiàn)共分4種形式:
B+樹實(shí)現(xiàn):b+樹比較適合用作'>'或'<'這樣的范圍查詢,是MySQL中最常使用的一種索引實(shí)現(xiàn)。
R-tree:是一種用于處理多維數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),可以對地理數(shù)據(jù)進(jìn)行空間索引。不過實(shí)際業(yè)務(wù)場景中使用的比較少。
Hash:是使用散列表來對數(shù)據(jù)進(jìn)行索引,Hash方式不像Btree那樣需要多次查詢才能定位到記錄,因此Hash索引的效率高于B-tree,但是不支持范圍查找和排序等功能.實(shí)際使用的也比較少。
FullText:就是我們前面提到的全文索引,是一種記錄關(guān)鍵字與對應(yīng)文檔關(guān)系的倒排索引。
MySQL調(diào)優(yōu)
MySQL的調(diào)優(yōu)也是研發(fā)人員需要掌握的一項(xiàng)技能。
一般MySQL調(diào)優(yōu)有圖中的4個(gè)緯度:
針對數(shù)據(jù)庫設(shè)計(jì)、表結(jié)構(gòu)設(shè)計(jì)以及索引設(shè)置緯度進(jìn)行的優(yōu)化。
對業(yè)務(wù)中使用的SQL語句進(jìn)行優(yōu)化,例如調(diào)整Where查詢條件。
對mysql服務(wù)的配置進(jìn)行優(yōu)化,例如對鏈接數(shù)的管理,對索引緩存、查詢緩存、排序緩存等各種緩存大小進(jìn)行優(yōu)化。
對硬件設(shè)備和操作系統(tǒng)設(shè)置進(jìn)行優(yōu)化,例如調(diào)整操作系統(tǒng)參數(shù)、禁用Swap、增加內(nèi)存、升級固態(tài)硬盤等等。
這四個(gè)緯度從優(yōu)化的成本角度來講,從左到右優(yōu)化成本逐漸升高;從優(yōu)化效果角度來看,從右到左優(yōu)化的效果更高。
對于研發(fā)人員來說,前兩個(gè)緯度與業(yè)務(wù)息息相關(guān),因此需要重點(diǎn)掌握,后兩個(gè)緯度更適合DBA進(jìn)行深入學(xué)習(xí),簡單了解就好。
本文將重點(diǎn)關(guān)注前兩個(gè)緯度
1.表結(jié)構(gòu)和索引的優(yōu)化
應(yīng)該掌握如下6個(gè)原則:
第1個(gè)原則:要在設(shè)計(jì)表結(jié)構(gòu)時(shí),考慮數(shù)據(jù)庫的水平與垂直擴(kuò)展能力,提前規(guī)劃好未來1年的數(shù)據(jù)量、讀寫量的增長,規(guī)劃好分庫分表方案。比如設(shè)計(jì)用戶信息表,預(yù)計(jì)1年后用戶數(shù)據(jù)10億條,寫QPS約5000,讀QPS30000,可以設(shè)計(jì)按UID緯度進(jìn)行散列,分為4個(gè)庫每個(gè)庫32張表,單表數(shù)據(jù)量控制在KW級別。
第2個(gè)原則:要為字段選擇合適的數(shù)據(jù)類型,在保留擴(kuò)展能力的前提下,優(yōu)先選用較小的數(shù)據(jù)結(jié)構(gòu)。例如保存年齡的字段,要使用TINYINT而不要使用INT。
第3個(gè)原則:可以將字段多的表分解成多個(gè)表,必要時(shí)增加中間表進(jìn)行關(guān)聯(lián)。假如一張表有4、50個(gè)字段顯然不是一個(gè)好的設(shè)計(jì)。
第4個(gè)原則:是設(shè)計(jì)關(guān)系數(shù)據(jù)庫時(shí)需要滿足第三范式,但為了滿足第三范式,我們可能會拆分出多張表。而在進(jìn)行查詢時(shí)需要對多張表進(jìn)行關(guān)聯(lián)查詢,有時(shí)為了提高查詢效率,會降低范式的要求,在表中保存一定的冗余信息,也叫做反范式。但要注意反范式一定要適度。
第5個(gè)原則:要擅用索引,比如為經(jīng)常作為查詢條件的字段創(chuàng)建索引、創(chuàng)建聯(lián)合索引時(shí)要根據(jù)最左原則考慮索引的復(fù)用能力,不要重復(fù)創(chuàng)建索引;要為保證數(shù)據(jù)不能重復(fù)的字段創(chuàng)建唯一索引等等。不過要注意索引對插入、更新等寫操作是有代價(jià)的,不要濫用索引。比如像性別這樣唯一很差的字段就不適合建立索引。
第6個(gè)原則:列字段盡量設(shè)置為Not Null,MySQL難以對使用Null的列進(jìn)行查詢優(yōu)化,允許Null會使索引、索引統(tǒng)計(jì)和值更加復(fù)雜。允許Null值的列需要更多的存儲空間,還需要MySQL內(nèi)部進(jìn)行特殊處理。
2.SQL語句進(jìn)行優(yōu)化的原則
共分5個(gè)原則:
第1個(gè)原則:要找的最需要優(yōu)化的SQL語句。要么是使用最頻繁的語句,要么是優(yōu)化后提高最明顯的語句,可以通過查詢MySQL的慢查詢?nèi)罩緛戆l(fā)現(xiàn)需要進(jìn)行優(yōu)化的SQL語句。
第2個(gè)原則:要學(xué)會利用MySQL提供的分析工具。例如使用Explain來分析語句的執(zhí)行計(jì)劃,看看是否使用了索引,使用了哪個(gè)索引,掃描了多少記錄,是否使用文件排序等等?;蛘呃肞rofile命令來分析某個(gè)語句執(zhí)行過程中各個(gè)分步的耗時(shí)。
第3個(gè)原則:要注意使用查詢語句是要避免使用Select *,而是應(yīng)該指定具體需要獲取的字段。原因一是可以避免查詢出不需要使用的字段,二是可以避免查詢列字段的元信息。
第4個(gè)原則:是盡量使用Prepared Statements,一個(gè)是性能更好,另一個(gè)是可以防止SQL注入。
第5個(gè)原則:是盡量使用索引掃描來進(jìn)行排序,也就是盡量在有索引的字段上進(jìn)行排序操作。
面試考察點(diǎn)
必須了解數(shù)據(jù)庫的基本原理、使用場景以及常用隊(duì)列、數(shù)據(jù)庫的特點(diǎn)。MySQL提供了多種引擎可以支持事務(wù)型與非事務(wù)型的關(guān)系對象庫服務(wù)等等。
要深刻理解數(shù)據(jù)庫事務(wù)的ACID特性,了解并發(fā)事務(wù)可能導(dǎo)致的并發(fā)問題和不同的數(shù)據(jù)庫隔離級別如何解決這些并發(fā)問題。
要掌握常用的MySQL語句,比如WHERE條件查詢語句、JOIN關(guān)聯(lián)語句、ORDER BY排序語句等等。還要熟悉常用的自帶函數(shù),例如SUM、COUNT等等。
要了解MySQL數(shù)據(jù)庫不同引擎的特點(diǎn)及不同類型的索引實(shí)現(xiàn)。比如最長使用的InnoDB非常擅長事務(wù)處理,MyISAM比較適合非事務(wù)的簡單查詢場景。比如知道MySQL的唯一索引、聯(lián)合索引、全文索引等不同索引類型,以及最長使用等B+樹索引實(shí)現(xiàn)等等。
面試加分項(xiàng)
要了解新特性,例如MySQL8.0中提供了窗口函數(shù)來支持新的查詢方式;支持通用表表達(dá)式,使復(fù)雜查詢中的嵌入表語句更加清晰等等。
要知道數(shù)據(jù)庫表設(shè)計(jì)原則,如果有過線上業(yè)務(wù)數(shù)據(jù)庫的設(shè)計(jì)經(jīng)驗(yàn)就更好了,你能夠知道如何對容量進(jìn)行評估,也知道適當(dāng)分庫分表來保證未來服務(wù)的可擴(kuò)展性,這會對面試起到積極的影響。
最好有過數(shù)據(jù)庫調(diào)優(yōu)經(jīng)驗(yàn),例如明明建立了索引的語句,但是查詢效率還是很慢,通過Explain分析發(fā)現(xiàn)表中有多個(gè)索引,MySQL的優(yōu)化器選用了錯(cuò)誤的索引,導(dǎo)致查詢效率偏低,然后通過在SQL語句中使用Use Index來指定索引解決。
聯(lián)系客服