更新時(shí)間:2022-12-16 14:48:41 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1175次
1.UNION ALL 與 UNION 的區(qū)別
UNION和UNION ALL關(guān)鍵字都是將兩個(gè)結(jié)果集合并為一個(gè)。
UNION在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。而UNION ALL只是簡單的將兩個(gè)結(jié)果合并后就返回。由于UNION需要排序去重,所以 UNION ALL 的效率比 UNION 好很多。
2.TRUNCATE 與 DELETE 區(qū)別
TRUNCATE 是DDL語句,而 DELETE 是DML語句。TRUNCATE 是先把整張表drop調(diào),然后重建該表。而 DELETE 是一行一行的刪除,所以 TRUNCATE 的速度肯定比 DELETE 速度快。TRUNCATE 不可以回滾,DELETE 可以。TRUNCATE 執(zhí)行結(jié)果只是返回0 rows affected,可以解釋為沒有返回結(jié)果。TRUNCATE 會(huì)重置水平線(自增長列起始位),DELETE 不會(huì)。TRUNCATE 只能清理整張表,DELETE 可以按照條件刪除。一般情景下,TRUNCATE性能比DELETE好一點(diǎn)。
3.TIMESTAMP 與 DATETIME 的區(qū)別
相同點(diǎn)TIMESTAMP 列的顯示格式與 DATETIME 列相同。顯示列寬固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS。
不同點(diǎn)TIMESTAMP4個(gè)字節(jié)存儲(chǔ),時(shí)間范圍:1970-01-01 08:00:01~2038-01-19 11:14:07。值以UTC格式保存,涉及時(shí)區(qū)轉(zhuǎn)化,存儲(chǔ)時(shí)對(duì)當(dāng)前的時(shí)區(qū)進(jìn)行轉(zhuǎn)換,檢索時(shí)再轉(zhuǎn)換回當(dāng)前的時(shí)區(qū)。
DATETIME8個(gè)字節(jié)存儲(chǔ),時(shí)間范圍:1000-10-01 00:00:00~9999-12-31 23:59:59。實(shí)際格式存儲(chǔ),與時(shí)區(qū)無關(guān)。
4.什么是聯(lián)合索引
兩個(gè)或更多個(gè)列上的索引被稱作聯(lián)合索引,聯(lián)合索引又叫復(fù)合索引。
5.為什么要使用聯(lián)合索引
減少開銷:建一個(gè)聯(lián)合索引(col1,col2,col3),實(shí)際相當(dāng)于建了(col1),(col1,col2),(col1,col2,col3)三個(gè)索引。減少磁盤空間的開銷。
覆蓋索引:對(duì)聯(lián)合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通過遍歷索引取得數(shù)據(jù),而無需回表,這減少了很多的隨機(jī)io操作。覆蓋索引是主要的提升性能的優(yōu)化手段之一。
效率高:索引列越多,通過索引篩選出的數(shù)據(jù)越少。有1000W條數(shù)據(jù)的表,有如下sql select from table where col1=1 and col2=2 and col3=3,假設(shè)假設(shè)每個(gè)條件可以篩選出10%的數(shù)據(jù),如果只有單值索引,那么通過該索引能篩選出1000W * 10%=100w條數(shù)據(jù),然后再回表從100w條數(shù)據(jù)中找到符合col2=2 and col3= 3的數(shù)據(jù),然后再排序,再分頁;如果是聯(lián)合索引,通過索引篩選出1000w * 10% * 10% * 10%=1w,效率得到明顯提升。
6.MySQL 聯(lián)合索引最左匹配原則
在 MySQL 建立聯(lián)合索引時(shí)會(huì)遵循最左前綴匹配的原則,即最左優(yōu)先,在檢索數(shù)據(jù)時(shí)從聯(lián)合索引的最左邊開始匹配。
MySQL 會(huì)一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調(diào)整。= 和 in 可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優(yōu)化器會(huì)幫你優(yōu)化成索引可以識(shí)別的形式。
7.什么是聚集和非聚集索引
聚集索引就是以主鍵創(chuàng)建的索引。
非聚集索引就是以非主鍵創(chuàng)建的索引。
8.什么是覆蓋索引
覆蓋索引(covering index)指一個(gè)查詢語句的執(zhí)行只用從索引頁中就能夠取得(如果不是聚集索引,葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵+列值,最終還是要回表,也就是要通過主鍵再查找一次),避免了查到索引后,再做回表操作,減少I/O提高效率。
可以結(jié)合第10個(gè)問題更容易理解。
9.什么是前綴索引
前綴索引就是對(duì)文本的前幾個(gè)字符(具體是幾個(gè)字符在創(chuàng)建索引時(shí)指定)創(chuàng)建索引,這樣創(chuàng)建起來的索引更小。但是MySQL不能在ORDER BY或GROUP BY中使用前綴索引,也不能把它們用作覆蓋索引。
以上就是“九個(gè)常見的sql數(shù)據(jù)庫面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743