接上篇?。?!
9. 主鍵使用自增ID還是UUID?
推薦使用自增ID,不要使用UUID。
因為在InnoDB存儲引擎中,主鍵索引是作為聚簇索引存在的,也就是說,主鍵索引的B+樹葉子節(jié)點上存儲了主鍵索引以及全部的數(shù)據(jù)(按照順序),如果主鍵索引是自增ID,那么只需要不斷向后排列即可,如果是UUID,由于到來的ID與原來的大小不確定,會造成非常多的數(shù)據(jù)插入,數(shù)據(jù)移動,然后導(dǎo)致產(chǎn)生很多的內(nèi)存碎片,進而造成插入性能的下降。
總之,在數(shù)據(jù)量大一些的情況下,用自增主鍵性能會好一些。
關(guān)于主鍵是聚簇索引,如果沒有主鍵,InnoDB會選擇一個唯一鍵來作為聚簇索引,如果沒有唯一鍵,會生成一個隱式的主鍵。
10. 字段為什么要求定義為not null?
null值會占用更多的字節(jié),且會在程序中造成很多與預(yù)期不符的情況。
11. 如果要存儲用戶的密碼散列,應(yīng)該使用什么字段進行存儲?
密碼散列,鹽,用戶身份證號等固定長度的字符串應(yīng)該使用char而不是varchar來存儲,這樣可以節(jié)省空間且提高檢索效率。
12. 優(yōu)化查詢過程中的數(shù)據(jù)訪問
(1)訪問數(shù)據(jù)太多導(dǎo)致查詢性能下降
(2)確定應(yīng)用程序是否在檢索大量超過需要的數(shù)據(jù),可能是太多行或列
(3)確認MySQL服務(wù)器是否在分析大量不必要的數(shù)據(jù)行
(4)避免犯如下SQL語句錯誤
(5)查詢不需要的數(shù)據(jù)。解決辦法:使用limit解決
(6)多表關(guān)聯(lián)返回全部列。解決辦法:指定列名
(7)總是返回全部列。解決辦法:避免使用SELECT *
(8)重復(fù)查詢相同的數(shù)據(jù)。解決辦法:可以緩存數(shù)據(jù),下次直接讀取緩存
(9)是否在掃描額外的記錄。解決辦法:
(10)使用explain進行分析,如果發(fā)現(xiàn)查詢需要掃描大量的數(shù)據(jù),但只返回少數(shù)的行,可以通過如下技巧去優(yōu)化:
(11)使用索引覆蓋掃描,把所有的列都放到索引中,這樣存儲引擎不需要回表獲取對應(yīng)行就可以返回結(jié)果。
(12)改變數(shù)據(jù)庫和表的結(jié)構(gòu),修改數(shù)據(jù)表范式
(13)重寫SQL語句,讓優(yōu)化器可以以更優(yōu)的方式執(zhí)行查詢。
13. 優(yōu)化長難的查詢語句
(1)一個復(fù)雜查詢還是多個簡單查詢
(2)MySQL內(nèi)部每秒能掃描內(nèi)存中上百萬行數(shù)據(jù),相比之下,響應(yīng)數(shù)據(jù)給客戶端就要慢得多
(3)使用盡可能小的查詢是好的,但是有時將一個大的查詢分解為多個小的查詢是很有必要的。
(4)切分查詢
(5)將一個大的查詢分為多個小的相同的查詢
(6)一次性刪除1000萬的數(shù)據(jù)要比一次刪除1萬,暫停一會的方案更加損耗服務(wù)器開銷。
(7)分解關(guān)聯(lián)查詢,讓緩存的效率更高。
(8)執(zhí)行單個查詢可以減少鎖的競爭。
(9)在應(yīng)用層做關(guān)聯(lián)更容易對數(shù)據(jù)庫進行拆分。
(10)查詢效率會有大幅提升。
(11)較少冗余記錄的查詢。
14. 優(yōu)化特定類型的查詢語句
(1)count(*)會忽略所有的列,直接統(tǒng)計所有列數(shù),不要使用count(列名)
(2)MyISAM中,沒有任何where條件的count(*)非??臁?/p>
(3)當有where條件時,MyISAM的count統(tǒng)計不一定比其它引擎快。
(4)可以使用explain查詢近似值,用近似值替代count(*)
(5)增加匯總表
(6)使用緩存
15. 優(yōu)化關(guān)聯(lián)查詢
(1)確定ON或者USING子句中是否有索引。
(2)確保GROUP BY和ORDER BY只有一個表中的列,這樣MySQL才有可能使用索引。
16. 優(yōu)化子查詢
(1)用關(guān)聯(lián)查詢替代
(2)優(yōu)化GROUP BY和DISTINCT
(3)這兩種查詢據(jù)可以使用索引來優(yōu)化,是最有效的優(yōu)化方法
(4)關(guān)聯(lián)查詢中,使用標識列分組的效率更高
(5)如果不需要ORDER BY,進行GROUP BY時加ORDER BY NULL,MySQL不會再進行文件排序。
(6)WITH ROLLUP超級聚合,可以挪到應(yīng)用程序處理
17. 優(yōu)化LIMIT分頁
(1)LIMIT偏移量大的時候,查詢效率較低
(2)可以記錄上次查詢的最大ID,下次查詢時直接根據(jù)該ID來查詢
18. 優(yōu)化UNION查詢
(1)UNION ALL的效率高于UNION
19. 優(yōu)化WHERE子句
解題方法
對于此類考題,先說明如何定位低效SQL語句,然后根據(jù)SQL語句可能低效的原因做排查,先從索引著手,如果索引沒有問題,考慮以上幾個方面,數(shù)據(jù)訪問的問題,長難查詢句的問題還是一些特定類型優(yōu)化的問題,逐一回答。
最后,小編分類整理了許多java進階學習材料和BAT面試給熱愛IT行業(yè)的你,如果需要資料的請轉(zhuǎn)發(fā)此文章后再私聊小編回復(fù)【java】就能領(lǐng)取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也可以加群:712263501領(lǐng)取海量學習資料進行學習。