1. 程式人生 > 實用技巧 >資料優化查詢之索引學習

資料優化查詢之索引學習

借鑑文章:https://blog.csdn.net/u012954706/article/details/81241049

一 .索引是啥?

索引是對資料庫表中一列或多列的值進行排序的一種儲存結構。在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過儲存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄

索引是一個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。索引提供指向儲存在表的指定列中的資料值的指標,然後根據您指定的排序順序對這些指標排序。

簡單來說,索引是為了加速對錶中資料行的檢索而建立的一種分散的儲存結構索引是針對表而建立的

,它是由資料頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指標,以便加速檢索物理資料。

二、索引的作用

在資料庫系統中建立索引主要有以下作用:

1、快速取資料; --索引的排序功能和儲存邏輯

2、保證資料記錄的唯一性;--唯一索引

3、實現表與表之間的參照完整性;--主鍵索引

4、在使用ORDER by、group by子句進行資料檢索時,利用索引可以排序和分組的時間。--索引的排序功能和儲存邏輯

三、索引的型別

索引是一個抽象的名次,它包含了很多具體的細分,不同的實現方式形成的不同型別的索引,也將在不同的場景中發揮各自的作用。在這裡,我們根據資料庫的功能,可以在資料庫設計器中建立四種索引:普通索引、唯一索引、主鍵索引和聚集索引(非聚集索引)。

下面我依次做一個介紹。

1、普通索引

最基本的索引型別,沒有唯一性之類的限制。普通索引可以通過以下幾種方式建立:

建立索引,例如CREATE INDEX ON tablename (列的列表);

修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表); ALTER INDEX RENAME TO;[2]

建立表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

2、唯一索引

唯一索引是不允許其中任何兩行具有相同索引值的索引。

當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在 employee 表中職員的姓 (lname) 上建立了唯一索引,則任何兩個員工都不能同姓。

對某個列建立UNIQUE索引後,插入新紀錄時,資料庫管理系統會自動檢查新紀錄在該列上是否取了重複值,在CREATE TABLE 命令中的UNIQE約束將隱式建立UNIQUE索引。

建立唯一索引的幾種方式:

建立索引,例如CREATE UNIQUE INDEX ON tablename (列的列表);

修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表); ;

建立表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );

3、主鍵索引

資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。

在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。

提示儘管唯一索引有助於定位資訊,但為獲得最佳效能結果,建議改用主鍵索引。

4、聚集索引(聚簇索引)

在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。

索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。聚集索引更適用於對很少對基表進行增刪改操作的情況。

1.2、什麼場景不適合建立索引

第一,對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因 為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
第二,對於那 些只有很少資料值的列也不應該增加索引。因為本來結果集合就是相當於全表查詢了,所以沒有必要。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的資料行佔了表中資料行的很大比 例,即需要在表中搜索的資料行的比例很大。增加索引,並不能明顯加快檢索速度。
第三,對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。
第四,當修改效能遠遠大於檢索效能時,不應該建立索 引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因 此,當修改效能遠遠大於檢索效能時,不應該建立索引。
第五,不會出現在where條件中的欄位不該建立索引。

1.3、什麼樣的欄位適合建立索引


1、表的主鍵、外來鍵必須有索引;外來鍵是唯一的,而且經常會用來查詢
2、資料量超過300的表應該有索引;
3、經常與其他表進行連線的表,在連線欄位上應該建立索引;經常連線查詢,需要有索引
4、經常出現在Where子句中的欄位,加快判斷速度,特別是大表的欄位,應該建立索引,建立索引,一般用在select ……where f1 and f2 ,我們在f1或者f2上建立索引是沒用的。只有兩個使用聯合索引才能有用
5、經常用到排序的列上,因為索引已經排序。
6、經常用在範圍內搜尋的列上建立索引,因為索引已經排序了,其指定的範圍是連續的
2、索引優缺點
2.1、優點

索引由資料庫中一列或多列組合而成,其作用是提高對錶中資料的查詢速度
索引的優點是可以提高檢索資料的速度
2.2、缺點

索引的缺點是建立和維護索引需要耗費時間<br/**>
索引可以提高查詢速度,會減慢寫入速度

索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。
3、索引分類
1,普通索引:
僅加速查詢 最基本的索引,沒有任何限制,是我們大多數情況下使用到的索引。

1CREATE INDEX index_name on user_info(name) ;

2,唯一索引:
與普通索引型別,不同的是:加速查詢 + 列值唯一(可以有null)

1CREATE UNIQUE INDEX mail on user_info(name) ;

3,全文索引:
全文索引(FULLTEXT)僅可以適用於MyISAM引擎的資料表;作用於CHAR、VARCHAR、TEXT資料型別的列。
4,組合索引:
將幾個列作為一條索引進行檢索,使用最左匹配原則。
1、普通索引
1.1.1、建立表的時候同事建立索引

1 create table healerjean (
2 id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
3 name VARCHAR(32) NOT NULL COMMENT '姓名',
4 email VARCHAR(64) NOT NULL COMMENT '郵箱',
5 message text DEFAULT NULL COMMENT '個人資訊',
6 INDEX index_name (name) COMMENT '索引name'
7 ) COMMENT = '索引測試表';

1.1.2、在存在的表上建立索引

1create index index_name on healerjean(name)

1.1.3、注意:

對於建立索引時如果是blob 和 text 型別,必須指定length。

1create index ix_extra on in1(message(200));

2alter table employee add index emp_name (name);

1.2、刪除索引

1drop index_name on healerjean;

2alter TABLE users drop index name_index ;

1.3、檢視索引

這個時候,我們會發現其實主鍵id也是一個索引

1show index from healerjean;