三、索引實現方式
四、索引的設計原則
普通索引: 最基本的索引,它沒有任何限制。
唯一索引:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值組合必須唯一。
主鍵索引:一種特殊的唯一索引,不允許有空值。一般在建表時同時建立主鍵索引。
組合索引:顧名思義,就是將單列索引進行組合。
外來鍵索引:只有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條資料找這條資料,如果...