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