您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關mysql中的非聚簇索引,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
mysql中非聚簇索引是:
非聚簇索引,索引的一種。索引分為聚簇索引和非聚簇索引兩種。建立索引的目的是加快對表中記錄的查找或排序。索引順序與數據物理排列順序無關。
每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。但是,一個表可以有不止一個非聚簇索引。實際上,對每個表你最多可以建立249個非聚簇索引。非聚簇索引需要大量的硬盤空間和內存。另外,雖然非聚簇索引可以提高從表中取數據的速度,它也會降低向表中插入和更新數據的速度。每當你改變了一個建立了非聚簇索引的表中的數據時,必須同時更新索引。因此你對一個表建立非聚簇索引時要慎重考慮。如果你預計一個表需要頻繁地更新數據,那么不要對它建立太多非聚簇索引。另外,如果硬盤和內存空間有限,也應該限制使用非聚簇索引的數量。
一個例子
下面我們創建了一個學生表,做三種查詢,來說明什么情況下是聚簇索引,什么情況下不是。
create table student ( id bigint, no varchar(20) , name varchar(20) , address varchar(20) , PRIMARY KEY (`branch_id`) USING BTREE, UNIQUE KEY `idx_no` (`no`) USING BTREE )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
第一種,直接根據主鍵查詢獲取所有字段數據,此時主鍵是聚簇索引,因為主鍵對應的索引葉子節點存儲了id=1的所有字段的值。
select * from student where id = 1
第二種,根據編號查詢編號和名稱,編號本身是一個唯一索引,但查詢的列包含了學生編號和學生名稱,當命中編號索引時,該索引的節點的數據存儲的是主鍵ID,需要根據主鍵ID重新查詢一次,所以這種查詢下no不是聚簇索引
select no,name from student where no = 'test'
第三種,我們根據編號查詢編號(有人會問知道編號了還要查詢?要,你可能需要驗證該編號在數據庫中是否存在),這種查詢命中編號索引時,直接返回編號,因為所需要的數據就是該索引,不需要回表查詢,這種場景下no是聚簇索引
select no from student where no = 'test'
總結:
主鍵一定是聚簇索引,MySQL的InnoDB
中一定有主鍵,即便研發人員不手動設置,則會使用unique索引,沒有unique索引,則會使用數據庫內部的一個行的id來當作主鍵索引,其它普通索引需要區分SQL場景,當SQL查詢的列就是索引本身時,我們稱這種場景下該普通索引也可以叫做聚簇索引,MyisAM引擎沒有聚簇索引。
看完上述內容,你們對mysql中的非聚簇索引有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。