現(xiàn)成的手機(jī)網(wǎng)站做APP深圳百度首頁優(yōu)化
大家好,我是程序員魚皮。歡迎屏幕前的各位來到今天的模擬面試現(xiàn)場,接下來我會(huì)出一道經(jīng)典的后端面試題,你只需要進(jìn)行 4 個(gè)簡單的選擇,就能判斷出來你的水平是新手(3k)、初級(10k)、中級(15k)還是高級(30k)!
請聽題:
題目
MySQL 數(shù)據(jù)庫中的 count(1)、count(*)、count(字段)有什么區(qū)別?
在面試鴨上查看
請回答
1、它們在功能上有區(qū)別么?
A:有區(qū)別
B:沒區(qū)別
答案
有區(qū)別。雖然在 MySQL 中,count(*)、count(1) 和 count(字段名) 都是用來 統(tǒng)計(jì)行數(shù)的聚合函數(shù) 。
但 count(*) 和 count(1) 會(huì)統(tǒng)計(jì)表中所有行的數(shù)量,包括 null 值(不會(huì)忽略任何一行數(shù)據(jù));而 count(字段名) 只會(huì)統(tǒng)計(jì)指定字段不為 null 的行數(shù)。
恭喜答對的朋友,3k 的 offer 到手啦!
2、count(*) 和 count(1) 誰更快?
A:count(*)
B:count(1)
C:沒區(qū)別
答案
效率一致,沒區(qū)別。
關(guān)于 count(1) 和 count(*) 誰更快的問題,網(wǎng)上眾說紛紜,如果背了不專業(yè)的八股文,可能答案就選錯(cuò)咯~
有點(diǎn)經(jīng)驗(yàn)的程序員,在遇到不確定的問題時(shí),當(dāng)然要去源頭親自求證,得去看官網(wǎng)怎么說。如圖:
官網(wǎng)表示 There is no performance difference
,即二者沒有性能上的區(qū)別!
對于 count(字段) 的查詢就是全表掃描,正常情況下它還需要判斷字段是否是 null 值,因此理論上會(huì)比 count(1) 和 count(*) 慢。
但是如果字段不為 null,例如是主鍵或具有非空約束,那么理論上性能也差不多。而且本質(zhì)上它們的統(tǒng)計(jì)功能不一樣,在需要統(tǒng)計(jì) null 的時(shí)候,只能用 count(1) 和 count(*),不需要統(tǒng)計(jì) null 的時(shí)候只能用 count(字段),所以也不用太糾結(jié)性能問題。
恭喜答對的朋友,10k 的 offer 到手啦!
3、用 count(*) 統(tǒng)計(jì)有千萬條記錄的表的總數(shù)據(jù)量,快不快?
A:快
B:慢
C:其他
答案
這是一道簡單的場景題,有經(jīng)驗(yàn)的程序員,本能地會(huì)想到 具體情況具體分析 。
MySQL 有 2 個(gè)主流的存儲(chǔ)引擎 MyISAM 和 InnoDB。
在 MyISAM 引擎中,有一個(gè)內(nèi)部計(jì)數(shù)器來維護(hù)表的記錄數(shù),查詢時(shí)可以直接返回表的行數(shù),而無需掃描整個(gè)表,所以 count(*) 非??臁?/p>
但是在 InnoDB 引擎中無法維護(hù)記錄總數(shù),需要掃描整個(gè)表,所以表越大、記錄越多,count(*) 就越慢。
為什么 InnoDB 引擎不維護(hù)記錄總數(shù)呢?因?yàn)樗С中墟i,會(huì)有很多并發(fā)修改表數(shù)據(jù)的操作,難以維護(hù)總數(shù),還會(huì)帶來額外的性能開銷;而 MyISAM 只有表鎖,對單個(gè)表的修改串行執(zhí)行,所以能維護(hù)總數(shù)。所以要針對業(yè)務(wù)場景選擇不同的 MySQL 引擎。
恭喜答對的朋友,15k 的 offer 到手啦!
4、InnoDB 引擎中,count(id) 和 count(二級索引) 哪個(gè)成本更低?
A:count(id)
B:count(二級索引)
C:其他
答案
count(二級索引) 通常成本更低。是不是沒想到?
這是對上一問的進(jìn)一步追問,雖然 InnoDB 引擎中 count(*) 統(tǒng)計(jì)總數(shù)性能不高,但它也針對這個(gè)操作進(jìn)行了一定的優(yōu)化。
id 通常是主鍵索引,在 InnoDB 中,主鍵索引是聚簇索引,它存儲(chǔ)了實(shí)際的數(shù)據(jù)行。執(zhí)行 count 時(shí),InnoDB 需要遍歷整個(gè)聚簇索引來統(tǒng)計(jì)行數(shù)。
二級索引是指存儲(chǔ)了索引列和主鍵列的指針,而不包含實(shí)際的數(shù)據(jù)行。因此,二級索引相對來說更小。執(zhí)行 count 時(shí),InnoDB 只需要遍歷這個(gè)較小的二級索引,而不是整個(gè)聚簇索引,需要讀取的數(shù)據(jù)頁更少,所以成本更低。
當(dāng)然,理論歸理論,具體情況具體分析,具體的性能差異取決于索引的大小和表的結(jié)構(gòu),可以用 explain 語句查看查詢計(jì)劃和成本。
恭喜答對的朋友,30k 的 offer 到手啦!
哦不對,恭喜摸到了 30k 的門檻,繼續(xù)努力,說不定下一個(gè)技術(shù)專家就是你~
最后
通過這道題目可以發(fā)現(xiàn),其實(shí)面試的時(shí)候,很多題目都是可以深挖的,挖的越深,越能體現(xiàn)出候選人的水平。
有同學(xué)表示:自己面試題目都答上來了,為啥還是通過不了?
別灰心,可能只是差點(diǎn)兒運(yùn)氣,同場面試有同學(xué)比你答的更深、表達(dá)更流暢罷了。
不管怎么樣,大家在準(zhǔn)備面試八股文的時(shí)候,有時(shí)間的話,多思考一點(diǎn)、再深入一點(diǎn),自己也能學(xué)到很多東西。歡迎多到我們的 面試刷題神器 - 面試鴨 上看看。
你答對了幾問呢?歡迎大家在評論區(qū)留言~
更多
💻 編程學(xué)習(xí)交流:編程導(dǎo)航
📃 簡歷快速制作:老魚簡歷
?? 面試刷題神器:面試鴨