mysql 聚集索引,非聚集索引,覆蓋索引區別。


把原站信息經過篩選貼過來,用於自己備忘。原站:https://www.cnblogs.com/aspwebchh/p/6652855.html

--------------------------------mysql執行計划關鍵字: explain----------------------------------------

聚集索引:

給表上了主鍵,那么表在內存上的由整齊排列的結構轉變成了樹狀結構,也就是「平衡樹」結構,換句話說,就是整個表就變成了一個索引。沒錯, 再說一遍, 整個表變成了一個索引,也就是所謂的「聚集索引」。 這就是為什么一個表只能有一個主鍵, 一個表只能有一個「聚集索引」,因為主鍵的作用就是把「表」的數據格式轉換成「索引(平衡樹)」的格式放置。

非聚集索引:

非聚集索引和聚集索引一樣, 同樣是采用平衡樹作為索引的數據結構。索引樹結構中各節點的值來自於表中的索引字段, 假如給user表的name字段加上索引 , 那么索引就是由name字段中的值構成,在數據改變時, DBMS需要一直維護索引結構的正確性。如果給表中多個字段加上索引 , 那么就會出現多個獨立的索引結構,每個索引(非聚集索引)互相之間不存在關聯。

區別在於, 通過聚集索引可以查到需要查找的數據, 而通過非聚集索引可以查到記錄對應的主鍵值 , 再使用主鍵的值通過聚集索引查找到需要的數據。

覆蓋索引:

如果一個索引包含所有需要查詢的字段的值,我們就稱之為“覆蓋索引”。因此不需要通過主鍵ID值的查找數據行的真實所在, 直接取得葉節點中name的值返回即可。

個人理解:

非聚集索引就是一般常用的索引,索引樹的根節點是表的主鍵。

聚集索引就是主鍵組成的樹,根節點是數據庫真實數據的位置。

另外知識點:

許多數據庫的文檔會告訴讀者:聚集索引按照順序物理的存儲數據到磁盤。但是試想下,如果聚集索引必須按照特定順序存放物理記錄,則維護成本顯得非常高。所以,聚集索引的磁盤存儲並不是物理上連續的,而是邏輯上連續。

(具體參考評論區,這樣一直一直走 )

--------------------------------------------------------------------------

mysql開啟了ICP的話,可以減少存儲引擎訪問基表的次數

下面來簡單的介紹一下這三者的區別

using index :使用覆蓋索引的時候就會出現

using where:在查找使用索引的情況下,需要回表去查詢所需的數據

using index condition:查找使用了索引,但是需要回表查詢數據

using index & using where:查找使用了索引,但是需要的數據都在索引列中能找到,所以不需要回表查詢數據

以上四點就能看出它們之前的區別,或許有部分人都存在疑惑 using index & using where 和using index condition那個比較好,從上面的的解釋中就能看出是前者比較好,畢竟不需要回表查詢數據,效率上應該比較快的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM