罷工助手在哪
850
2022-05-28
大家好,我是漫步coding, 最近在整理2022年Mysql最新面試題, 大家也可以通過我下面的博客地址在線閱讀,?今天講講第2篇: ?索引。本文首發于公眾號: 漫步coding
2022年MySQL最新面試題目錄
MySQL數據庫基礎知識
大家好,我是漫步coding, 最近在整理2022年MySQL最新面試題, 大家也可以通過我下面的博客地址在線閱讀,?今天講講第2篇: ?索引。本文首發于公眾號: 漫步coding
MySQL數據庫基礎知識
MySQL索引
MySQL存儲引擎
MySQL事務
MySQL數據庫讀寫鎖
MySQL視圖
MySQL觸發器
MySQL數據庫優化
MySQL部署和運維
1、可以簡單談談MySQL存儲引擎MyISAM與InnoDB區別
2、MyISAM索引與InnoDB索引的區別?
3、InnoDB引擎的4大特性
出現概率: ★★★★
1)、關于 InnoDB
InnoDB 是 MySQL 的默認事務型引擎,用來處理大量短期事務。InnoDB 的性能和自動崩潰恢復特性使得它在非事務型存儲需求中也很流行,除非有特別原因否則應該優先考慮 InnoDB。
InnoDB 的數據存儲在表空間中,表空間由一系列數據文件組成。MySQL4.1 后 InnoDB 可以將每個表的數據和索引放在單獨的文件中。
InnoDB 采用 MVCC 來支持高并發,并且實現了四個標準的隔離級別。其默認級別是 REPEATABLE READ,并通過間隙鎖策略防止幻讀,間隙鎖使 InnoDB 不僅僅鎖定查詢涉及的行,還會對索引中的間隙進行鎖定防止幻行的插入。
InnoDB 表是基于聚簇索引建立的,InnoDB 的索引結構和其他存儲引擎有很大不同,聚簇索引對主鍵查詢有很高的性能,不過它的二級索引中必須包含主鍵列,所以如果主鍵很大的話其他所有索引都會很大,因此如果表上索引較多的話主鍵應當盡可能小。
InnoDB 的存儲格式是平***立的,可以將數據和索引文件從一個平臺復制到另一個平臺。
InnoDB 內部做了很多優化,包括從磁盤讀取數據時采用的可預測性預讀,能夠自動在內存中創建加速讀操作的自適應哈希索引,以及能夠加速插入操作的插入緩沖區等。
2)、關于MyISAM
MySQL5.1及之前,MyISAM 是默認存儲引擎,MyISAM 提供了大量的特性,包括全文索引、壓縮、空間函數等,但不支持事務和行鎖,最大的缺陷就是崩潰后無法安全恢復。對于只讀的數據或者表比較小、可以忍受修復操作的情況仍然可以使用 MyISAM。
MyISAM 將表存儲在數據文件和索引文件中,分別以 .MYD 和 .MYI 作為擴展名。MyISAM 表可以包含動態或者靜態行,MySQL 會根據表的定義決定行格式。MyISAM 表可以存儲的行記錄數一般受限于可用磁盤空間或者操作系統中單個文件的最大尺寸。
MyISAM 對整張表進行加鎖,讀取時會對需要讀到的所有表加共享鎖,寫入時則對表加排它鎖。但是在表有讀取查詢的同時,也支持并發往表中插入新的記錄。
對于MyISAM 表,MySQL 可以手動或自動執行檢查和修復操作,這里的修復和事務恢復以及崩潰恢復的概念不同。執行表的修復可能導致一些數據丟失,而且修復操作很慢。
對于 MyISAM 表,即使是 BLOB 和 TEXT 等長字段,也可以基于其前 500 個字符創建索引。MyISAM 也支持全文索引,這是一種基于分詞創建的索引,可以支持復雜的查詢。
MyISAM 設計簡單,數據以緊密格式存儲,所以在某些場景下性能很好。MyISAM 最典型的性能問題還是表鎖問題,如果所有的查詢長期處于 Locked 狀態,那么原因毫無疑問就是表鎖。
出現概率: ★★★★
MyISM和InnoDB索引都是由B+樹實現的,但在索引管理數據方式上卻有所不同。
1)、InnoDB是聚集索引,數據文件是和(主鍵)索引綁在一起的,即索引 + 數據 = 整個表數據文件,通過主鍵索引到整個記錄,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,因為輔助索引是以建索引的字段為關鍵字索引到主鍵,所以需要兩次,先查詢到主鍵,然后再通過主鍵查詢到數據。
主鍵索引:以主鍵索引到整條記錄
輔助索引:以另一字段索引到主鍵
2)、MyISAM是非聚集索引,也是使用B+Tree作為索引結構,索引和數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。也就是說:InnoDB的B+樹主鍵索引的葉子節點就是數據文件,輔助索引的葉子節點是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節點都是數據文件的地址指針。
主鍵索引:以關鍵字索引到記錄的地址
輔助索引:以某字段索引到記錄地址
出現概率: ★★★
1)、插入緩沖 (Insert Buffer/Change Buffer)
插入緩存之前版本叫insert buffer,現版本 change buffer,主要提升插入性能,change buffer是insert buffer的加強,insert buffer只針對insert有效,change buffering對insert、delete、update(delete+insert)、purge都有效。
2)、雙寫機制(Double Write)
在InnoDB將BP中的Dirty Page刷(flush)到磁盤上時,首先會將(memcpy函數)Page刷到InnoDB tablespace的一個區域中,我們稱該區域為Double write Buffer(大小為2MB,每次寫入1MB,128個頁,每個頁16k,其中120個頁為后臺線程的批量刷Dirty Page,還有8個也是為了前臺起的sigle Page Flash線程,用戶可以主動請求,并且能迅速的提供空余的空間)。在向Double write Buffer寫入成功后,第二步、再將數據分別刷到一個共享空間和真正應該存在的位置。
3)、自適應哈希索引(Adaptive Hash Index,AHI)
哈希算法是一種非常快的查找方法,在一般情況(沒有發生hash沖突)下這種查找的時間復雜度為O(1)。InnoDB存儲引擎會監控對表上輔助索引頁的查詢。如果觀察到建立hash索引可以提升性能,就會在緩沖池建立hash索引,稱之為自適應哈希索引(Adaptive Hash Index,AHI)。
4)、預讀 (Read Ahead)
預讀(read-ahead)操作是一種IO操作,用于異步將磁盤的頁讀取到buffer pool中,預料這些頁會馬上被讀取到。預讀請求的所有頁集中在一個范圍內。
也歡迎關注我的公眾號:?漫步coding, 回復:?mysql免費獲取最新Mysql面試題匯總(含答案)。一起交流, 在coding的世界里漫步。
MySQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。