mysql索引學習(一)

2021-09-02 11:43:32 字數 4523 閱讀 2587

mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質:索引是一種資料結構。資料庫查詢是資料庫的主要功能之一,最基本的查詢演算法是順序查詢(linear search)時間複雜度為o(n),顯然在資料量很大時效率很低。優化的查詢演算法如二分查詢(binary search)、二叉樹查詢(binary tree search)等,雖然查詢效率提高了。但是各自對檢索的資料都有要求:二分查詢要求被檢索資料有序,而二叉樹查詢只能應用於二叉查詢樹上,但是資料本身的組織結構不可能完全滿足各種資料結構(例如,理論上不可能同時將兩列都按順序進行組織)。所以,在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構。這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構就是索引。mysql的索引分為單列索引(主鍵索引,唯索引,普通索引)和組合索引.

1-1)    普通索引,這個是最基本的索引,

其sql格式是 create index indexname on `tablename`(`欄位名`(length)) 或者 alter table tablename add index indexname(`欄位名`(length))

第一種方式 :

create index account_index on `award`(`account`);
第二種方式:

alter table award add index account_index(`account`)
如果是char,varchar,型別,length可以小於欄位的實際長度,如果是blob和text型別就必須指定長度,

1-2)    唯一索引,與普通索引類似,但是不同的是唯一索引要求所有的類的值是唯一的,這一點和主鍵索引一樣.但是他允許有空值,其sql格式是 create unique index indexname on `tablename`(`欄位名`(length)); 或者 alter table tablename add unique (column_list)  

create unique index account_unique_index on `award`(`account`);
1-3)    主鍵索引,不允許有空值,(在b+tree中的innodb引擎中,主鍵索引起到了至關重要的地位)

主鍵索引建立的規則是 int優於varchar,一般在建表的時候建立,最好是與表的其他欄位不相關的列或者是業務不相關的列.一般會設為 int 而且是 auto_increment自增型別的

乙個表中含有多個單列索引不代表是組合索引,通俗一點講 組合索引是:包含多個字段但是只有索引名稱

其sql格式是 create index indexname on `tablename`(`欄位名`(length),`欄位名`(length),...);

如果你建立了 組合索引(nickname_account_createdtime_index) 那麼他實際包含的是3個索引 (nickname) (nickname,account)(nickname,account,created_time)

在使用查詢的時候遵循mysql組合索引的"最左字首",下面我們來分析一下 什麼是最左字首:及索引where時的條件要按照建立索引的時候欄位的排序方式

1、不按索引最左列開始查詢(多列索引) 例如index(『c1』, 『c2』, 『c3』) where 『c2』 = 『aaa』 不使用索引,where `c2` = `aaa` and `c3`=`sss` 不能使用索引

2、查詢中某個列有範圍查詢,則其右邊的所有列都無法使用查詢(多列查詢)

where c1= 『***』 and c2 like = 『aa%』 and c3=』sss』 改查詢只會使用索引中的前兩列,因為like是範圍查詢

3、不能跳過某個欄位來進行查詢,這樣利用不到索引,比如我的sql 是 

explain select * from `award` where nickname > 'rsuqfzpkdz3r' and account = 'dyxjoqzq2rd7' and created_time = 1449567822; 那麼這時候他使用不到其組合索引.因為我的索引是 (nickname, account, created_time),如果第乙個字段出現 範圍符號的查詢,那麼將不會用到索引,如果我是第二個或者第三個字段使用範圍符號的查詢,那麼他會利用索引,利用的索引是(nickname),因為上面說了建立組合索引(nickname, account, created_time), 會出現三個索引

文字欄位上(text)如果建立的是普通索引,那麼只有對文字的字段內容前面的字元進行索引,其字元大小根據索引建立索引時申明的大小來規定.如果文字中出現多個一樣的字元,而且需要查詢的話,那麼其條件只能是 where column lick '%***x%' 這樣做會讓索引失效.這個時候全文索引就起到了作用了

alter table tablename add fulltext(column1, column2)
有了全文索引,就可以用select查詢命令去檢索那些包含著乙個或多個給定單詞的資料記錄了。

elect * from tablename

where match(column1, column2) against(『***′, 『sss′, 『ddd′)

這條命令將把column1和column2欄位裡有***、sss和ddd的資料記錄全部查詢出來。

刪除索引的mysql格式 :dorp index indexname on `tablename`

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

2.建立索引可以大大提高檢索的資料,以及減少表的檢索行數

3.在表連線的連線條件 可以加速表與表直接的相連 

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

5.建立索引,在查詢中使用索引 可以提高效能。

1.在建立索引和維護索引 會耗費時間,隨著資料量的增加而增加

2.索引檔案會占用物理空間,除了資料表需要占用物理空間之外,每乙個索引還會占用一定的物理空間

3.當對表的資料進行 insert,update,delete 的時候,索引也要動態的維護,這樣就會降低資料的維護速度,(建立索引會占用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在乙個大表上建立了多種組合索引,索引檔案的會膨脹很快)。

在建立索引的時候應該考慮索引應該建立在資料庫表中的某些列上面 哪一些索引需要建立,哪一些所以是多餘的.

一般來說,

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 like '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索引學習

一 索引建立的三個方法 1 建表時增加索引create table create table forindex id int auto increment name varchar 30 not null,age tinyint,idcard varchar 18 unique,gender tin...

MySQL索引學習

索引是幫助mysql搞笑獲取資料的資料結構,即排好序的快速查詢資料結構。優點 缺點 普通索引 基本的索引型別,值可以為空,沒有唯一性限制。唯一索引 索引列的值必須唯一,允許有空值。主鍵索引 一種唯一性索引,必須指定為primary key,乙個表只能有乙個主鍵,不允許有空值。組合索引 由多個字段建立...

mysql索引學習

空間換時間 select from student where name tom 若 name 字段沒有索引 full table scan 若 name 欄位有索引 減少scan的數目 基於某一列建立,由某一列上的資料組成。create index on students name alter t...