簡介
索引用於快速找出在某個列中有一特定值的行,不使用索引,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...