MySQL聚集索引詳解 mysql索引詳解

2021-10-18 23:48:27 字數 2034 閱讀 2061

資料結構分,有b-tree索引(b+ tree)、雜湊索引、r-tree索引等。按資料塊的順序和索引節點的邏輯順序是否一致可以分為聚集索引和非聚集索引。聚集索引由於物理塊連續,在範圍掃瞄的時候可以減少磁頭尋道時間,因而比非聚集索引高效。

幾種索引型別的選擇:

primary:主鍵索引。

unique:唯一索引。不允許重複,可以為null。

normal:普通索引。

fulltext:只能對char, varchar和text列編制索引,並且只能在myisam表中編制。

spatial:只能對空間列編制索引,並且只能在myisam表中編制。

個人總結:

一般使用主鍵+組合索引,主鍵是唯一值(一般用id)。組合索引常用於條件查詢使用,比如where需要兩個字段,或者where+order by。其中,需要注意一條sql只能使用1個索引,也就是,如果where使用了,order by不能和前者滿足組合索引左字首關係,order by就不使用索引index排序而使用filesort了,當然效能也就差了。

聚集索引中,"聚集"的意思是指實際的資料行和相關的鍵值都儲存在一起,但是每個表只能有乙個聚集索引,不能把一行資料儲存在兩個地方。

myisam

1、非聚集索引,所以即使建立主鍵,也是非聚集的。

2、b+tree,所有索引的葉節點是資料的實體地址。

3、如果唯一索引不允許存在null值,那與主鍵索引本質上一樣。

4、第二(其他)索引,查詢資料,找到實體地址,然後從中讀取。

innodb

1、聚集索引(有且僅有乙個),如果有主鍵,主鍵就是聚集索引,若沒有主鍵且有唯一索引,第乙個唯一索引就是聚集索引,如果都沒有,則表自動生成乙個6位元組的聚集索引來做排序id。

2、b+tree,聚集索引的葉節點是完整資料,其他索引葉節點是聚集索引的鍵值。

3、如果唯一索引不允許存在null值,查詢卻還是需要先找到資料的聚集索引唯一值,再去聚集索引中找對應資料。

4、第二(其他)索引,查詢資料,找到後再根據聚集索引唯一值去聚集索引中找對應資料。

建議:當索引為字串,而且字串又比較長,可以使用字首索引(即只使用該欄位指定長度的部分字元)減少其索引空間,但是這樣就不能用於order by和group by了。

對於多表索引:一定要在join的字段上建立索引,而且該欄位型別編碼必須一致,才能優化sql。

索引的官方介紹:

mysql為表把它的資料詞典資訊以.frm檔案的形式存在資料庫目錄裡,這對所有mysql儲存引擎都是真的。但是每個innodb表在表空間內的innodb內部資料詞典裡有它自己的條目。當mysql移除表或資料庫,它不得不刪除.frm檔案和innodb資料詞典內的相應條目。這就是為什麼你不能在資料庫之間簡單地移動.frm檔案來移動innodb表。

每個innodb表有專門索引,被稱為clustered index,對行的資料被存於其中。如果你對你的表定義乙個primary key,主鍵的索引是集束索引。

如果你沒有為表定義primary key,mysql取第乙個不允許not null列的unique索引作為主鍵,並且innodb把它當作集束索引來用。如果表中沒有這樣乙個索引,innodb內部產生乙個集束索引,其中用innodb在這樣乙個表內指定給行的行id來排序行。行id是乙個6位元組的域,它在新行被插入的時候單一地增加。因此被行id排序的行是物理地按照插入順序排的。

通過集束索引訪問乙個行是較快的,因為行資料是在索引搜尋引導的同一頁面。如果表是巨大的,當對比於傳統解決方案,集束索引構架經常節約磁碟i/o。(在許多資料庫,資料傳統地被存在與索引記錄不同的頁)。

innodb比較char和varchar字串不同長度,以便在較短字串中剩下的長度被處理視為用空格補上的。

15.2.13.1. 索引的物理結構

所有innodb的索引是b數,其中索引記錄被儲存在樹的樹葉頁。乙個索引頁的預設大小是16kb。當新記錄被插入,innodb試著為將來索引記錄的插入和更新留下十六分之一的空白頁。

如果索引記錄以連續的順序被插入(公升序或者降序),結果索引頁大約是15/16滿。如果記錄被以隨機的順序被插入,頁面是從1/2到 15/16滿。如果索引頁的填充因子降到低於1/2,innodb試著搜尋索引樹來釋放頁。

MySQL聚集索引詳解 mysql 索引詳解

直接起飛 1.什麼是索引?索引是幫助mysql高效獲取資料的排好序的資料結構。2.索引的資料結構?為什麼選這種結構?假設我們現在這裡有一張表 以下情況都是innodb儲存引擎 idnumber 如果mysql沒有索引這種結構,那麼我們如果查詢number為51的這行記錄,那麼mysql就要從上往下掃...

mysql聚集索引 MySQL索引之聚集索引介紹

在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...

MySQL 聚集索引 非聚集索引簡述

mysql索引中可以分為聚集索引與非聚集索引兩類,在網路上也見過聚簇的說法,這裡先簡單介紹兩種索引的含義與適用場景。懶得畫圖,全是字。索引的鍵值邏輯順序決定了表資料行的物理儲存順序,也就是在資料庫上連線的記錄在磁碟上的物理儲存位址也是相鄰的,注意這一點特性,我們可以分析出它的適用情況。由於聚集索引規...