mysql 索引 簡書 MySQL 索引

2021-10-20 22:33:10 字數 3368 閱讀 3910

簡介

索引用於快速找出在某個列中有一特定值的行,不使用索引,mysql必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢資料所花費的時間就越多。

如果表中查詢的列有乙個索引,mysql能夠快速到達乙個位置去搜尋資料檔案,而不必檢視所有資料,那麼將會節省很大一部分時間。

使用原則

索引底層使用的是b+樹實現, 因為 b+ 樹的特點是能夠保持資料穩定有序,其插入與修改擁有較穩定的對數時間複雜度。所以b+ 樹通常用於資料庫和作業系統的中做元資料索引。

雖然合理的設定索引可以明顯提高查詢速度,但也是要付出額外代價的:

一是建立索引會而外增加資料庫的儲存空間

二是會在插入和修改資料時要花費較多的時間(因為索引也要隨之變動)。

通過上面的我們可以知道,索引有利有弊,並不是索引越多越好,我們要有選擇性的合理使用索引。

什麼時候應該使用索引:

在需要經常查詢的列上建立索引,這樣會提高查詢效率。

在表與表的而連線條件上加上索引,可以提高連線查詢的效率。

什麼時候避免建立索引:

如果是查詢中很少使用到的列是不應該為其建立索引的。

在重複值多的字段上不建立索引,比如在學生表的"性別"欄位上只有男,女兩個不同值。相反的,如果乙個欄位上不同值較多可是建立索引的。

對經常更新的表(增、刪、改)應避免對其進行過多的索引。

資料量小的表最好不要使用索引(資料量越大使用索引效率越高,資料量小提公升不大)。

應避免對資料型別為 text, image ,bit欄位建立索引,因為這些列的資料量要麼相當大,要麼取值很少。

不為沒有限制 not null,建立索引。

使用索引查詢時需要需要注意的:

不當的操作會使mysql放棄使用索引,轉而使用全表掃瞄。

條件中有 or,mysql查詢時會放棄索引,使用全表掃瞄。(要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引)

like查詢是以%開頭,也會讓索引失效。

如果列型別是字串,需要在條件中將資料使用引號包裹起來,否則不使用索引如:select * from user where name = 'admin'; admin 要用引號包裹。

索引列沒有限制 not null,因為索引不會記錄空值,沒有設定 not null 的,資料庫會認為索引字段可能存在空值,不會按照索引查詢。

就像上面第4條所說的,索引不會記錄 null,所以 is null, is not null 也使索引失效。

mysql 使用 != 或者 <> 時也會是索引失效,啟用全盤掃面。

不要再索引列上做任何操作(計算、函式、型別轉換),這些都會導致索引失效。

mysql索引的分類

1. 普通索引

mysql中基本索引型別,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹為了查詢資料更快一點。

2. 唯一索引

索引列中的值必須是唯一的,但是允許為空值。

3. 主鍵索引

是一種特殊的唯一索引,不允許有空值,mysql預設為單主鍵字段設定索引。

4. 組合索引

在表中的多個字段組合上建立的索引,列值的組合必須唯一,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用。

5. 全文索引

全文索引,只有在myisam引擎上才能使用,只能在char,varchar,text型別欄位上使用全文索引。

注意:索引是在儲存引擎中實現的,也就是說不同的儲存引擎,會使用不同的索引

而mysql使用的myisam和innodb儲存引擎:只支援btree索引, 也就是說預設使用btree,不能夠更換

檢視、新增及刪除 索引

檢視表的索引資訊

mysql 檢視索引的 sql 語句:

show index from 表名;

或者:show index from 資料庫名.表名;

再或者:

show index from 表名 from 資料庫名;

show index from 會返回表的索引資訊,有以下字段:

table:表的名稱。

non_unique:如果索引不能包括重複詞,則為0。如果可以,則為1。

key_name:索引的名稱。

seq_in_index:索引中的列序列號,從1開始。

column_name:列名稱。

collation:列以什麼方式儲存在索引中。在mysqlshow index語法中,有值』a』(公升序)或null(無分類)。

cardinality:索引中唯一值的數目的估計值。基數越大,當進行聯合時,mysql使用該索引的機會就越大。

sub_part:如果列只是被部分地編入索引,則為被編入索引的字元的數目。如果整列被編入索引,則為null。

packed:指示關鍵字如何被壓縮。如果沒有被壓縮,則為null。

null:如果列含有null,則含有yes。如果沒有,則該列含有no。

index_type:用的索引方法(btree, fulltext, hash, rtree)。

comment:多種評注。

新增索引

第一種方式

使用 alter table 建立索引

alter table 表名 add 索引型別 (unique,primary key,fulltext,index)[索引名](欄位名)

// 普通索引

alter table table_name add index index_name (column_list);

// alter table 表名 add index 索引名 (欄位名);

//唯一索引

alter table table_name add unique (column_list);

//主鍵索引

alter table table_name add primary key (column_list);

第二種方式

create index可用於對錶增加普通索引或unique索引,可用於建表時建立索引(建表後也可以使用)。

create index index_name on table_name(column_list(length));

length可以省略,但是如果是 blob 和 text 型別必須指定 length。

//create只能新增這兩種索引;

create index 索引名on 表名(欄位名(長度));

// 普通

create index index_name on table_name (column_list)

// 唯一

create unique index index_name on table_name (column_list)

對於第一種方式索引名index_name可選,預設時,mysql將欄位名稱作為索引名。

另外上面兩種方式都有可以指定多個字段,用逗號分隔即可。

mysql索引詳細介紹簡書 Mysql索引介紹

資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。索引的實現通常使用b樹及其變種b 樹。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。為表設...

mysql 索引 簡書 MySQL 基礎之索引

mysql 索引 索引索引用於快速查詢具有特定列值的行。如果沒有索引,mysql必須從第一行開始,然後讀取整個表以查詢相關行。表越大,成本越高。如果表中有相關 列的索引,mysql可以快速確定要在資料檔案中間尋找的位置,而無需檢視所有資料。這比按順序讀取每一行要快得多。類似於字典中的目錄,查詢字典內...

mysql 覆蓋索引 簡書 覆蓋索引

覆蓋索引 1 當發起乙個被索引覆蓋的查詢時,在explain的extra列可以看到using index的資訊,此時就使用了覆蓋索引 mysql explain select store id,film id from inventory g 1.row id 1 select type table...