1.MYSQL支持的存儲引擎有哪些, 有什么區別 ??
? ? ? ? In-no-DB(默認):支持事務安全(數據庫運行時,能保證數據的一致性、完整性),支持表行鎖,支持物理和邏輯外鍵。占用磁盤空間大。
? ? ? ? MEMORY:只支持邏輯外鍵,只支持表鎖,不支持事務安全
????????My-I-SAM:只支持邏輯外鍵,只支持表鎖,不支持事務安全
? ? ? ?
2 了解過Mysql的索引嘛 ??
索引能幫助MySQL高效獲取數據。如果查找某個字段的話,MYsql查詢很慢,因為它是磁盤讀取以及時間復雜度是On,但是我們通過索引能夠大大加快尋找這個數據的速度。索引在Mysql的底層是構建了一個B+🌳,把這個字段的數據放進去了。
它底層是通過構建B+樹把建立的索引字段給納入進去了。
B和B+樹區別:
1??B每個節點都存儲數據,但B+只有葉子節點下一層存儲數據
B+樹非葉節點存的數據是這個數據指向的節點的最大值。如,上圖第二行第一個節點中的15指向的是第三行第一個節點的最大值15.
B樹的葉子節點為空節點。B+樹葉子節點保存的是數據。
3 索引的底層數據結構了解過嘛 ? ?
? ? ? ? 如上,123是同一個答案。
4 什么是聚簇索引什么是非聚簇索引 ?
InnoDB索引引擎中,分為二級索引和聚集索引。
聚集索引:數據和索引存到了一起,必須有,且只有一個。字段通常唯一
二級索引:數據和索引分開的。
聚集索引的葉子節點存儲的是行數據,但是二級索引存儲的是行數據的主鍵id、索引字段所對應的數據。不存行數據是為了減少數據量。可以有多個。
5 ?知道什么是回表查詢嘛 ??
要查詢的字段,不在構建的索引的字段之內。
通常一個二級索引,最后回到聚集索引的情況叫做會表。比如search * from user where name = 'Amy'? ? ? ? ? ? ?
其中name已經創立了二級索引,但是由于二級索引的葉子是主鍵ID,找不到*要查詢的name為Amy的數據的所有字段所對應的值,只能回到聚集索引表,故稱回表。?
6 ?索引創建原則有哪些?
1??一般對經常查詢,且數據量大的表建立索引。因為索引能大大加快查找速度。
2??如果搜的比較少,或者表很小的時候可以不建立索引。因為索引會消耗磁盤空間。
3??盡量使用字段空間小的做索引,比如char100比char10大,一般選char10做索引。
4??前綴檢索:如果要搜索的字段所對應的數據都比較大,比如字段“備注”里面存的數據都非常長。一般會只檢索字段前面的若干字符。
5??盡量采用區分度高的做索引,區分度越高,索引就越常用。
6??使用復合索引時不能跳過對應的條件。我們使用復合索引需要先創建復合索引,如果創建了INDEX(A,B,C,D),我們where A C B D,順序不同可以跑通,但是如果where BCD去掉了A,那么ABCD都跑不了。如果去掉了B,那么BCD都跑不了。這叫最左前綴匹配原則。很重要。
7??一般建立聯合索引,多放幾個常用的區分度達到額字段進去,避免索引到超出聯合索引包含的字段時回表。
8??一般常被where、group by、order by的字段建立索引。
7 知道什么是左前綴原則嘛 ?
同上。復合索引。可以順序不同,但是不能跳過
8 知道什么叫覆蓋索引嘛 ??
和回表相反。意思是我們要查的字段,包含在索引的字段之內
比如
CREATE INDEX idx_username ON users(username, email, age);//創建了索引,索引包含字段username、email、age
SELECT username, email FROM users WHERE username = 'john';//我們要查的字段是只有上述的username和email,被完全包含在了里面
9 索引是越多越好嘛? 什么樣的字段需要建索引, 什么樣的字段不需要 ??
索引不是越多越好,建立索引也會消耗空間,而且索引字段變多查找效率也會降低。
一般常被where、group by、order by的字段建立索引。不常用的不用建。