(十一)MySQL學習筆記 索引

2021-10-22 02:01:21 字數 4019 閱讀 4332

三、索引實現方式

四、索引的設計原則

普通索引: 最基本的索引,它沒有任何限制。

唯一索引:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值組合必須唯一。

主鍵索引:一種特殊的唯一索引,不允許有空值。一般在建表時同時建立主鍵索引。

組合索引:顧名思義,就是將單列索引進行組合。

外來鍵索引:只有innodb引擎支援外來鍵索引,用來保證資料的一致性、完整性和實現級聯操作。

全文索引:快速匹配全部文件的方式。innodb引擎5.6版本後才支援全文索引。memory引擎不支援。

b+tree索引 :mysql使用最頻繁的乙個索引資料結構,是innodb和myisam儲存引擎預設的索引型別。

hash索引 : mysql中memory儲存引擎預設支援的索引型別。

-- 建立db11資料庫

create

database db11;

-- 使用db11資料庫

use db11;

-- 建立student表

create

table student(

id int

primary

keyauto_increment

, name varchar(10

),age int

, score int);

-- 新增資料

insert

into student values

(null

,'張三',23

,98),

(null

,'李四',24

,95),

(null

,'王五',25

,96),

(null

,'趙六',26

,94),

(null

,'周七',27

,99);

-- 標準語法

create

[unique

|fulltext]

index 索引名稱

[using 索引型別]

-- 預設是b+tree

on 表名(列名...

);

-- 建立索引

create

index idx_name on student(name)

;-- 為name列建立普通索引

create

unique

index idx_age on student(age)

;-- 為age列建立唯一索引

-- 檢視索引

show

index

from student;

顯示如下:

-- 1.普通索引

alter

table 表名 add

index 索引名稱(列名)

;-- 2.組合索引

alter

table 表名 add

index 索引名稱(列名1

,列名2,.

..);

-- 3.主鍵索引(主鍵列自帶主鍵索引)

alter

table 表名 add

primary

key(主鍵列名)

;-- 4.外來鍵索引(新增外來鍵約束,就是外來鍵索引)

alter

table 表名 add

constraint 外鍵名 foreign

key(本表外來鍵列名)

references 主表名(主鍵列名)

;-- 5.唯一索引

alter

table 表名 add

unique 索引名稱(列名)

;-- 6.全文索引(mysql只支援文字型別)

alter

table 表名 add fulltext 索引名稱(列名)

;

-- 給score列新增唯一索引

alter

table student add

unique idx_score(score)

;

-- 標準語法

drop

index 索引名稱 on 表名;

-- 刪除score列的唯一索引

drop

index idx_score on student;

儲存引擎主要使用的索引方式有三種:磁碟儲存、b樹、b+樹。innodb引擎使用b+樹索引。

磁碟儲存

系統從磁碟中讀資料時以磁碟塊為單位,位於同乙個磁碟塊中的資料會同時被取出。

b樹b樹的每乙個節點同事儲存索引和資料,每個節點都占用乙個磁碟塊,並且有三個指向子樹節點的指標,指標中儲存子節點磁碟塊的位址。查詢索引時也會將整個節點所在磁碟塊的資料取出。

b+樹b+樹中所有的資料都存在最底層的葉子節點上,非葉節點只儲存索引資訊,這樣非葉結點不會進行磁碟的io。葉子節點之間彼此通過指標相連,方便進行範圍查詢,例如一次性查詢編號為26~30的資料。

對查詢頻次高且資料量大的表建立索引;

最好使用唯一索引,區分度越高索引效率越高;

最好從where子句中選擇索引字段;

索引不宜過多,會起反作用。

例如,為name、address、phone建立組合索引idx_nap:

alter

table

user

addindex idx_nap(name,address,phone)

;

此時,實際上是建立了3個索引:(name)、(name,address)、(name,address,phone)。

下面3條語句都可以命中索引:

select

*from

user

where address =

'北京'

and phone =

'12345'

and name =

'張三'

;-- 索引的字段順序無關緊要

select

*from

user

where name =

'張三'

and address =

'北京'

;select

*from

user

where name =

'張三'

;

這3條語句執行時按照最左匹配原則,分別使用如下3個索引:

(name,address,phone)

(name,address)

(name)

若建立組合索引時最左邊的列(此處為name)不在查詢語句中,根據最左匹配原則則不會命中索引。例如下面3條語句都不會命中索引:

select

*from

user

where address =

'北京'

and phone =

'12345'

;select

*from

user

where address =

'北京'

;select

*from

user

where phone =

'12345'

;

MYSQL索引 學習筆記

索引分類 索引失效 索引帶來的弊端 幫助mysql進行高效查詢的資料結構 有序 在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引 換言之,索引就是某種資料結構 如下圖所示 左邊是資料...

mysql索引學習筆記

mysql索引學習筆記 1.索引的優劣 優 加快查詢速率 劣 影響對錶的添刪改操作的速率,增大檔案大小 可能索引檔案比資料檔案還大 所以,在往資料庫匯入大量資料之前,應該先暫時刪除索引,資料匯入完成後再統一建立索引。www.2cto.com 2.建立索引的原則 1 不過度索引 2 索引應該建在需要頻...

MySQL索引學習筆記

需求分析 首先,先假設有一張表,表的資料有10w條資料,其中有一條資料是nickname css 如果要拿這條資料的話需要些的sql是 select from award where nickname css 一般情況下,在沒有建立索引的時候,mysql需要掃瞄全表及掃瞄10w條資料找這條資料,如果...