mysql索引簡談

2021-09-01 03:01:25 字數 3986 閱讀 5410

mysql索引簡談

一、什麼是索引

就好比我們在看一本書的時候,有目錄的話,我們可以快速定位到想看的地方,而沒有目錄的話,我們只能一頁一頁地翻。索引就像目錄,有了索引,資料庫可以快速查詢到目標內容,而不必查詢整個資料庫表,但是如果沒有的話,資料庫只能一行一行地遍歷資料。

create table `t_student` (

`st_id` varchar(20) not null comment '學號',

`st_name` varchar(20) not null comment '姓名',

`st_***` varchar(2) not null comment '性別',

`st_academy` varchar(20) not null comment '學院',

`st_major` varchar(20) not null comment '專業',

`st_class` varchar(20) not null comment '班級',

`st_grade` int(11) not null comment '年級',

`st_edu_len` int(11) not null comment '學制',

`st_is_at_school` varchar(4) default null comment '是否在校',

primary key  (`st_id`)

) engine=innodb default charset=utf8;

二、索引種類

(1)單列索引,包括普通索引(index)、唯一索引(unique inex)、主鍵索引(primary key),乙個單列索引只能包含一列屬性

(2)組合索引,乙個組合索引包括兩個或兩個以上的列。

(3)全文索引(fulltext index),檢索出多列文字欄位上(text型別)包含某些單詞的索引

三、索引的建立

(1)單列索引

普通索引,最基本的索引

第一種方式:語法為  create  index  索引名 on  表名(要建立索引的列名)

create index i_st_class on t_student(st_class);

第二種方式:語法為  alter  table  表名  add  index  索引名(要建立索引的列名)

alter table t_student add index i_st_class(st_class);

唯一索引,與普通索引類似,但唯一索引的每乙個索引值只對應唯一的資料記錄,這一點又與主鍵索引類似,但唯一索引允許null值

語法為:在建立普通索引的語句中的index前面加上unique即可(假設學生表中的姓名不重複)

create unique index i_st_name on t_student(st_name);

alter table t_student add unique index i_st_name(st_name);

主鍵索引,在唯一索引的基礎上不允許索引列有null值。主鍵索引一般用在與表中其他列無關或與業務無關的列上,一般是int,自增型別的列上。

不能使用create index語句建立主鍵索引,只能在建表時建立或alter語句中:

alter table t_student add primary key (st_id);

(2)組合索引

乙個組合索引包含多個列,乙個組合索引對應的資料記錄必須唯一,建立組合索引的語句如下:

create index i_name_major_class on t_student(st_name,st_major,st_class);

alter table t_student add index i_name_major_class(st_name,st_major,st_class);

如果我們建立了以上的組合索引,實際上包含了三個索引,分別是(name)、(name,major)、(name,major,class)

那麼我們在查詢的時候,如果要使用到組合索引,就必須遵循組合索引的「最左字首「原則。

什麼是最左字首原則?

用自己的話來說,就是從組合索引的最左列開始,where語句中必須包含此列,且可跳過中間列,到達目標列的匹配規則。

實際上就是上方所說的三種組合(name)、(name,major)、(name,major,class)

哪些語句走組合索引,哪些語句不走呢?

走組合索引的情況:

select * from t_student where st_name='123';

select * from t_student where st_name='123' and st_major='123';

select * from t_student where st_name='123' and st_class='123';

select * from t_student where st_name='123' and st_major='123' and st_class='123';

可以使用explain語句來顯示mysql對查詢處理的過程

不走組合索引的情況:

select * from t_student where st_major='123';

select * from t_student where st_class='123';

select * from t_student where st_major='123' and st_class='123';

即where條件中如果不帶組合索引的最左列的話,肯定不走組合索引。

【注意:保留意見,建議嘗試】

四、索引的刪除

刪除索引的格式為: alter  table  表名  drop  index  索引名  

alter table t_student drop index i_name_major_class;
或為:  drop  index  索引名  on  表名 

drop index i_name_majoe_class on t_student;

五、使用索引的優缺點

優點:可以通過建立唯一索引或者主鍵索引,保證資料庫表中每一行資料的唯一性

建立索引可以大大提高檢索的資料,提高查詢效能,以及減少表的檢索行數

在分組和排序的子句中進行資料檢索,可以減少查詢時間中分組和排序時所消耗的時間(資料庫中的記錄會重新排序)

缺點:建立索引和維護索引也會耗費時間

每乙個索引還會占用一定的物理空間,索引建得多了,資料庫檔案也會變得龐大起來

當對表的資料進行插入、刪除、更新的操作,索引也要動態的維護,這樣就會降低表的維護效率

六、使用索引需要注意的地方

.在經常需要搜尋的列上建立索引,可以加快查詢的速度

在主鍵列上建立主鍵索引,可以確保此列資料的唯一性

如果你對st_name欄位建立了乙個索引,當查詢時候的語句是 select * from t_student where st_name like '%123%'  或like '%123',那麼這個索引將不會起到作用,而st_name like '123%' 才可以用到索引

不要在列上進行運算,這樣會使得mysql索引失效,也會進行全表掃瞄

七、不需要建立索引的情況

查詢中很少使用到的列,不應該建立索引,如果建立了索引,就會降低mysql的效能,也占用了儲存空間

當表的插入、刪除、修改操作遠遠多與查詢操作時,不應該建立索引,此時會占用資料庫的儲存空間,降低維護效率,因為索引只能提高查詢效率

--------------------- 

原文: 

簡談mysql索引之聯合索引

我們程式設計師日常工作中打交道最多的就是聯合索引,基本上索引優化就是優化這一塊。講聯合索引,一定要扯上最左匹配原則。不廢話,直接進入正文。注 本文是在innodb的基礎上討論和實驗的。所謂最左原則指的就是如果你的 sql 語句中用到了聯合索引中的最左邊的索引,那麼這條 sql 語句就可以利用這個聯合...

簡談Mysql分割槽

談談mysql分割槽 mysql儲存是以檔案形式儲存在磁碟上的,一張表對應的三個檔案,分別是 frm frame 存放表結構,myd存放表資料,myi存放表索引 當資料量太大時,myd和myi就會過大,查詢就會變慢,這個時候我們就會用到mysql分割槽功能,將一張表對應的三個分割槽分成許多小塊。介紹...

mysql 索引 簡書 MySQL 索引

簡介 索引用於快速找出在某個列中有一特定值的行,不使用索引,mysql必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多。如果表中查詢的列有乙個索引,mysql能夠快速到達乙個位置去搜尋資料檔案,而不必檢視所有資料,那麼將會節省很大一部分時間。使用原則 索引底層使用...