接上篇H雇帧E凶硅!
9. 主鍵使用自增ID還是UUID?
推薦使用自增ID蒸辆,不要使用UUID。
因?yàn)樵贗nnoDB存儲引擎中析既,主鍵索引是作為聚簇索引存在的躬贡,也就是說,主鍵索引的B+樹葉子節(jié)點(diǎn)上存儲了主鍵索引以及全部的數(shù)據(jù)(按照順序)眼坏,如果主鍵索引是自增ID拂玻,那么只需要不斷向后排列即可,如果是UUID宰译,由于到來的ID與原來的大小不確定檐蚜,會造成非常多的數(shù)據(jù)插入,數(shù)據(jù)移動沿侈,然后導(dǎo)致產(chǎn)生很多的內(nèi)存碎片闯第,進(jìn)而造成插入性能的下降。
總之缀拭,在數(shù)據(jù)量大一些的情況下咳短,用自增主鍵性能會好一些。
關(guān)于主鍵是聚簇索引蛛淋,如果沒有主鍵咙好,InnoDB會選擇一個(gè)唯一鍵來作為聚簇索引,如果沒有唯一鍵褐荷,會生成一個(gè)隱式的主鍵勾效。
10. 字段為什么要求定義為not null?
null值會占用更多的字節(jié)叛甫,且會在程序中造成很多與預(yù)期不符的情況葵第。
11. 如果要存儲用戶的密碼散列,應(yīng)該使用什么字段進(jìn)行存儲合溺?
密碼散列卒密,鹽,用戶身份證號等固定長度的字符串應(yīng)該使用char而不是varchar來存儲棠赛,這樣可以節(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)使用索引覆蓋掃描,把所有的列都放到索引中伏伐,這樣存儲引擎不需要回表獲取對應(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萬末贾,暫停一會的方案更加損耗服務(wù)器開銷吼旧。
(7)分解關(guān)聯(lián)查詢,讓緩存的效率更高未舟。
(8)執(zhí)行單個(gè)查詢可以減少鎖的競爭圈暗。
(9)在應(yīng)用層做關(guān)聯(lián)更容易對數(shù)據(jù)庫進(jìn)行拆分。
(10)查詢效率會有大幅提升裕膀。
(11)較少冗余記錄的查詢员串。
14. 優(yōu)化特定類型的查詢語句
(1)count(*)會忽略所有的列,直接統(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)識列分組的效率更高
(5)如果不需要ORDER BY,進(jìn)行GROUP BY時(shí)加ORDER BY NULL咽安,MySQL不會再進(jìn)行文件排序伴网。
(6)WITH ROLLUP超級聚合,可以挪到應(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子句
解題方法
對于此類考題,先說明如何定位低效SQL語句糕珊,然后根據(jù)SQL語句可能低效的原因做排查动分,先從索引著手,如果索引沒有問題放接,考慮以上幾個(gè)方面刺啦,數(shù)據(jù)訪問的問題留特,長難查詢句的問題還是一些特定類型優(yōu)化的問題纠脾,逐一回答。
最后蜕青,小編分類整理了許多java進(jìn)階學(xué)習(xí)材料和BAT面試給熱愛IT行業(yè)的你苟蹈,如果需要資料的請轉(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í)右核。