MySql學習筆記 索引,外來鍵

2021-07-07 05:31:57 字數 4456 閱讀 7148

索引由資料庫表中一列或多列組合而成,其作用是提高對錶中資料的查詢速度。

索引是建立在表上的,是對資料庫表中一列或多列的值進行排序的一種結構。索引可以提高查詢的速度。

通過索引,查詢資料時可以不必讀完記錄的所有資訊,而只是查詢索引列。否則,資料庫系統將讀取每條記錄的所有資訊進行匹配。例如,索引相當於新華字典的音序表。

索引有兩種儲存型別,包括b型樹(btree)索引和雜湊(hash)索引。innodb和myisam儲存引擎支援btree索引,memory儲存引擎支援hash索引和btree索引,預設為前者。

索引的優點是可以提高檢索資料的速度,這是建立索引的最主要的原因;對於有依賴關係的子表和父表之間的聯合查詢時,可以提高查詢速度;使用分組和排序子句進行資料查詢時,同樣可以顯著節省查詢中分組和排序的時間。

索引的缺點是建立和維護索引需要耗費時間,耗費時間的數量隨著資料量的增加而增加;索引需要占用物理空間,每乙個索引要佔一定的物理空間;增加、刪除和修改資料時,要動態的維護索引,造成資料的維護速度降低了 。

mysql的索引包括普通索引、唯一性索引、全文索引、單列索引、多列索引和空間索引等。

1.普通索引

在建立普通索引時,不附加任何限制條件。這類索引可以建立在任何資料型別中,其值是否唯一和非空由字段本身的完整性約束條件決定。建立索引以後,查詢時可以通過索引進行查詢。例如,在student表的stu_id欄位上建立乙個普通索引。查詢記錄時,就可以根據該索引進行查詢。

2.唯一性索引

使用unique引數可以設定索引為唯一性索引。在建立唯一性索引時,限制該索引的值必須是唯一的。例如,在student表的stu_name欄位中建立唯一性索引,那麼stu_name欄位的值就必需是唯一的。通過唯一性索引,可以更快速地確定某條記錄。主鍵就是一種特殊唯一性索引。

3.全文索引(儲存引擎必須是myisam型別)

使用fulltext引數可以設定索引為全文索引。全文索引只能建立在char、varchar或text型別的字段上。查詢資料量較大的字串型別的字段時,使用全文索引可以提高查詢速度。例如,student表的information欄位是text型別,該欄位包含了很多的文字資訊。在information欄位上建立全文索引後,可以提高查詢information欄位的速度。mysql資料庫從3.23.23版開始支援全文索引,但只有myisam儲存引擎支援全文檢索。在預設情況下,全文索引的搜尋執行方式不區分大小寫。但索引的列使用二進位制排序後,可以執行區分大小寫的全文索引。

4.單列索引

在表中的單個欄位上建立索引。單列索引只根據該欄位進行索引。單列索引可以是普通索引,也可以是唯一性索引,還可以是全文索引。只要保證該索引只對應乙個字段 即可。

5.多列索引

多列索引是在表的多個欄位上建立乙個索引。該索引指向建立時對應的多個字段,可以通過這幾個字段進行查詢。但是,只有查詢條件中使用了這些欄位中第乙個欄位時,索引才會被使用。例如,在表中的id、name和***欄位上建立乙個多列索引,那麼,只有查詢條件使用了id欄位時該索引才會被使用。

6.空間索引

使用spatial引數可以設定索引為空間索引。空間索引只能建立在空間資料型別上,這樣可以提高系統獲取空間資料的效率。mysql中的空間資料型別包括geometry和point、linestring和polygon等。目前只有myisam儲存引擎支援空間檢索,而且索引的字段不能為空值。對於初學者來說,這類索引很少會用到。

建表時:

普通索引

create table index1 (id int ,

name varchar(20) ,

*** boolean ,

index ( id)

); show create table語句檢視表的結構

show create table index1;

使用explain語句可以檢視索引是否被使用

explain select * from index1 where id=1;

唯一性索引

create table index2 (id int unique ,

name varchar(20) ,

unique index index2_id ( id asc)

);

單列索引

create table index4 (id int ,

subject varchar(30) ,

index index4_st ( subject(10) )

);

多列索引

create table index5 (id int ,

name varchar(20) ,

*** char(4) ,

index index5_ns ( name, *** )

);

建表後
create [ unique | fulltext | spatial ] index 索引名

on 表名 (屬性名 [ (長度) ] [ asc | desc] );

create index index7_id on example0 ( id ) ;

單列索引

下面在index10表中的address欄位上建立名為index10_addr的單列索引。address欄位的資料型別為varchar(20),索引的資料型別為char(4)。

create index index10_addr on index10( address(4) ) ;

這樣,查詢時可以只查詢address欄位的前4個字元,而不需要全部查詢。

用alter table語句來建立索引

alter table 表名 add [ unique | fulltext | spatial ] index

索引名(屬性名 [ (長度) ] [ asc | desc]);

alter table example0 add index index13_name ( name(20) ) ;

一些不再使用的索引會降低表的更新速度,影響資料庫的效能。對於這樣的索引,應該將其刪除

drop index 索引名 on 表名 ;

drop index id on index1 ;

1、mysql中「鍵」和「索引」的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引,innodb不能自動地建立索引。

2、外來鍵可以是一對一的,乙個表的記錄只能與另乙個表的一條記錄連線,或者是一對多的,乙個表的記錄與另乙個表的多條記錄連線。

3、如果需要更好的效能,並且不需要完整性檢查,可以選擇使用myisam表型別,如果想要在mysql中根據參照完整性來建立表並且希望在此基礎上保持良好的效能,最好選擇表結構為innodb型別。

4、外來鍵的使用條件

① 兩個表必須是innodb表,myisam表暫時不支援外來鍵

② 外來鍵列必須建立了索引,mysql 4.1.2以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯式建立;

③ 外來鍵關係的兩個表的列必須是資料型別相似,也就是可以相互轉換型別的列,比如int和tinyint可以,而int和char則不可以;

5、外來鍵的好處:可以使得兩張表關聯,保證資料的一致性和實現一些級聯操作。

foreign key (當前表的欄位名)… references 參照表 (參照表的欄位名)

create table busi_table(

busi_id char(13) not null primary key,

busi_name char(13) not null,

foreign key(repo_id) references repo_table(repo_id));

增加級聯操作

alter table 子表 add foreign key(dage_id) references 父表(id) on delete cascade on update cascade;

關鍵字 含義

cascade 刪除包含與已刪除鍵值有參照關係的所有記錄

set null 修改包含與已刪除鍵值有參照關係的所有記錄,使用null值替換(只能用於已標記為not null的字段)

restrict 拒絕刪除要求,直到使用刪除鍵值的輔助表被手工刪除,並且沒有參照時(這是預設設定,也是最安全的設定)

no action 啥也不做

刪除外來鍵

alter table 子表 drop foreign key key-id;

參考文獻《mysql入門很簡單》

關於MySQL 外來鍵索引

1 什麼時候需要用到外來鍵索引呢?答 a表中存在唯一索引id a,b表中的字段包含id a,由於b表自身已經有主鍵索引,此時如果將字段id a設定為外來鍵索引索引 foreign key 則建立外來鍵索引。使用場景 1 父表更新時,子表也更新 父表刪除時,如果 2 子表有匹配的項,則刪除失敗。3 父...

MySQL學習筆記(11) 外來鍵

foreign key,外面的鍵 鍵不在自己表中 如果a表中有乙個字段 非主鍵 指向b表的主鍵,那麼將該子段稱之為外來鍵。a表被稱為從表,b表被稱為主表。1.建立表的時候增加外來鍵 constraint 外鍵名 foreign key 外來鍵字段 references 主表 主鍵 例項 create...

Mysql中的外來鍵索引

mysql create table tab1 id int,name char 20 query ok,0 rows affected 0.21 sec mysql alter table tab1 add primary key id query ok,0 rows affected 0.39 ...