需求分析
首先,先假設有一張表,表的資料有10w條資料,其中有一條資料是nickname='css',如果要拿這條資料的話需要些的sql是 select * from award where nickname = 'css'
一般情況下,在沒有建立索引的時候,mysql需要掃瞄全表及掃瞄10w條資料找這條資料,如果我在nickname上建立索引,那麼mysql只需要掃瞄一行資料及為我們找到這條nickname='css'的資料,是不是感覺效能提公升了好多咧....
mysql索引作用
索引分類
索引的缺點:
1.雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行insert、update和delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案
2.建立索引會占用磁碟空間的索引檔案
3.在建立索引和維護索引 會耗費時間,隨著資料量的增加而增加
4.索引檔案會占用物理空間,除了資料表需要占用物理空間之外,每乙個索引還會占用一定的物理空間
5.當對表的資料進行 insert,update,delete 的時候,索引也要動態的維護,這樣就會降低資料的維護速度,(建立索引會占用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在乙個大表上建立了多種組合索引,索引檔案的會膨脹很快)。
索引的優點:
1.可以通過建立唯一索引或者主鍵索引,保證資料庫表中每一行資料的唯一性.
2.建立索引可以大大提高檢索的資料,以及減少表的檢索行數
3.在表連線的連線條件 可以加速表與表直接的相連
4.在分組和排序字句進行資料檢索,可以減少查詢時間中 分組 和 排序時所消耗的時間(資料庫的記錄會重新排序)
5.建立索引,在查詢中使用索引 可以提高效能
一、索引建立
1、單列索引
1-1、普通索引
第一種方式:
create index indexname on `tablename`(`欄位名`(length));
第二種方式:
alter table tablename add index indexname(`欄位名`(length));
第三種方式:
create table mytable(id int not null,
username varchar(16) not null,
index [indexname] (username(length))
);
注意:如果是char,varchar,型別,length可以小於欄位的實際長度,如果是blob和text型別就必須指定長度。
1-2、唯一索引
與普通索引類似,但是不同的是唯一索引要求所在的列的值是唯一的,這一點和主鍵索引一樣.但是他允許有空值。
第一種方式:
create unique index indexname on `tablename`(`欄位名`(length));
第二種方式:
alter table tablename add unique (column_list) ;
第三種方式:
//建立表的時候直接指定create table mytable(
id int not null,
username varchar(16) not null,
unique [indexname] (username(length))
);
1-3、主鍵索引
與唯一索引類似,但不允許有空值
有四種方式來新增資料表的索引:alter table tbl_name add primary key (column_list): 該語句新增乙個主鍵,這意味著索引值必須是唯一的,且不能為null。
alter table tbl_name add unique index_name (column_list): 這條語句建立索引的值必須是唯一的(除了null外,null可能會出現多次)。
alter table tbl_name add index index_name (column_list): 新增普通索引,索引值可出現多次。
alter table tbl_name add fulltext index_name (column_list):該語句指定了索引為 fulltext ,用於全文索引。
1-5、顯示索引資訊
你可以使用 show index 命令來列出表中的相關的索引資訊。可以通過新增 \g 來格式化輸出資訊。嘗試以下例項:
mysql>show index from table_name; \g
........
2、組合索引
create index indexname on `tablename`(`欄位名`(length),`欄位名`(length),...);
二、索引刪除
刪除索引的mysql格式 :dorp index indexname on `tablename`
三、使用索引需要注意的地方
在建立索引的時候應該考慮索引應該建立在資料庫表中的某些列上面 哪一些索引需要建立,哪一些所以是多餘的.
一般來說,
1.在經常需要搜尋的列上,可以加快索引的速度
2.主鍵列上可以確保列的唯一性
3.在表與表的而連線條件上加上索引,可以加快連線查詢的速度
4.在經常需要排序(order by),分組(group by)和的distinct 列上加索引 可以加快排序查詢的時間, (單獨order by 用不了索引,索引考慮加where 或加limit)
5.在一些where 之後的 < <= > >= between in 以及某個情況下的like 建立欄位的索引(b-tree)
6.like語句的 如果你對nickname欄位建立了乙個索引.當查詢的時候的語句是 nickname lick '%abc%' 那麼這個索引講不會起到作用.而nickname lick 'abc%' 那麼將可以用到索引
7.索引不會包含null列,如果列中包含null值都將不會被包含在索引中,復合索引中如果有一列含有null值那麼這個組合索引都將失效,一般需要給預設值0或者 ' '字串
8.使用短索引,如果你的乙個欄位是char(32)或者int(32),在建立索引的時候指定字首長度 比如前10個字元 (前提是多數值是唯一的..)那麼短索引可以提高查詢速度,並且可以減少磁碟的空間,也可以減少i/0操作.
9.不要在列上進行運算,這樣會使得mysql索引失效,也會進行全表掃瞄
10.選擇越小的資料型別越好,因為通常越小的資料型別通常在磁碟,記憶體,cpu,快取中 占用的空間很少,處理起來更快
四、什麼情況下不建立索引
1.查詢中很少使用到的列 不應該建立索引,如果建立了索引然而還會降低mysql的效能和增大了空間需求.
2.很少資料的列也不應該建立索引,比如 乙個性別字段 0或者1,在查詢中,結果集的資料佔了表中資料行的比例比較大,mysql需要掃瞄的行數很多,增加索引,並不能提高效率
3.定義為text和image和bit資料型別的列不應該增加索引,
4.當表的修改(update,insert,delete)操作遠遠大於檢索(select)操作時不應該建立索引,這兩個操作是互斥的關係
MYSQL索引 學習筆記
索引分類 索引失效 索引帶來的弊端 幫助mysql進行高效查詢的資料結構 有序 在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引 換言之,索引就是某種資料結構 如下圖所示 左邊是資料...
mysql索引學習筆記
mysql索引學習筆記 1.索引的優劣 優 加快查詢速率 劣 影響對錶的添刪改操作的速率,增大檔案大小 可能索引檔案比資料檔案還大 所以,在往資料庫匯入大量資料之前,應該先暫時刪除索引,資料匯入完成後再統一建立索引。www.2cto.com 2.建立索引的原則 1 不過度索引 2 索引應該建在需要頻...
Mysql索引學習筆記
1.btree索引與hash索引 下列範圍查詢適用於 btree索引和hash索引 select from t1 where key col 1 or key col in 15,18,20 下列範圍查詢適用於btree索引 select from t1 where key col 1 and ke...