溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql中的非聚簇索引是什么

發(fā)布時間:2020-06-29 17:44:12 來源:億速云 閱讀:217 作者:元一 欄目:MySQL數(shù)據(jù)庫

今天就跟大家聊聊有關(guān)mysql中的非聚簇索引,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

mysql中非聚簇索引是:

非聚簇索引,索引的一種。索引分為聚簇索引和非聚簇索引兩種。建立索引的目的是加快對表中記錄的查找或排序。索引順序與數(shù)據(jù)物理排列順序無關(guān)。

每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。但是,一個表可以有不止一個非聚簇索引。實際上,對每個表你最多可以建立249個非聚簇索引。非聚簇索引需要大量的硬盤空間和內(nèi)存。另外,雖然非聚簇索引可以提高從表中取數(shù)據(jù)的速度,它也會降低向表中插入和更新數(shù)據(jù)的速度。每當(dāng)你改變了一個建立了非聚簇索引的表中的數(shù)據(jù)時,必須同時更新索引。因此你對一個表建立非聚簇索引時要慎重考慮。如果你預(yù)計一個表需要頻繁地更新數(shù)據(jù),那么不要對它建立太多非聚簇索引。另外,如果硬盤和內(nèi)存空間有限,也應(yīng)該限制使用非聚簇索引的數(shù)量。

一個例子

下面我們創(chuàng)建了一個學(xué)生表,做三種查詢,來說明什么情況下是聚簇索引,什么情況下不是。

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;

第一種,直接根據(jù)主鍵查詢獲取所有字段數(shù)據(jù),此時主鍵是聚簇索引,因為主鍵對應(yīng)的索引葉子節(jié)點存儲了id=1的所有字段的值。

select * from student where id = 1

第二種,根據(jù)編號查詢編號和名稱,編號本身是一個唯一索引,但查詢的列包含了學(xué)生編號和學(xué)生名稱,當(dāng)命中編號索引時,該索引的節(jié)點的數(shù)據(jù)存儲的是主鍵ID,需要根據(jù)主鍵ID重新查詢一次,所以這種查詢下no不是聚簇索引

select no,name from student where no = 'test'

第三種,我們根據(jù)編號查詢編號(有人會問知道編號了還要查詢?要,你可能需要驗證該編號在數(shù)據(jù)庫中是否存在),這種查詢命中編號索引時,直接返回編號,因為所需要的數(shù)據(jù)就是該索引,不需要回表查詢,這種場景下no是聚簇索引

select no from student where no = 'test'

總結(jié):

主鍵一定是聚簇索引,MySQL的InnoDB中一定有主鍵,即便研發(fā)人員不手動設(shè)置,則會使用unique索引,沒有unique索引,則會使用數(shù)據(jù)庫內(nèi)部的一個行的id來當(dāng)作主鍵索引,其它普通索引需要區(qū)分SQL場景,當(dāng)SQL查詢的列就是索引本身時,我們稱這種場景下該普通索引也可以叫做聚簇索引,MyisAM引擎沒有聚簇索引。

看完上述內(nèi)容,你們對mysql中的非聚簇索引有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI