mysql 索引介紹

2021-08-09 02:04:15 字數 2950 閱讀 9288

在大資料表裡,同一條mysql語句,使用索引與不使用索引是具有極大的區別。索引作用相當於書的目錄,可以加快搜尋的速度。但是目錄是需要用額外的紙張來儲存,建立索引也是需要額外的空間。所以過多的索引可能會導致索引檔案比資料檔案還要龐大。索引是可以加快,但是要慎用。下面介紹mysql的幾種索引。

最基本的索引,建立方式有:

//直接建立索引

create index index_name on

table(column(length))

//修改表結構建立索引

alter

table table_name add index index_name on (column(length))

//建立表時建立索引

create

table table_name(

`id`

int(11) not

null auto_increment,

`name`

varchar(30) default

'',primary

key (`id`),

index index_name(`name`)

);//刪除索引

drop index index_name on table_name

這種索引的索引列的值必須是唯一的,可以是null。

//直接建立索引

create

unique index index_name on table_name(column(length))

//修改表結構建立索引

alter

table table_name add

unique index_name on (column(length))

//建立表時建立索引

create

table table_name(

`id`

int(11) not

null auto_increment,

`name`

varchar(30) default

'',primary

key (`id`),

unique index_name(`name`)

);//刪除索引(沒有變化)

drop index index_name on table_name

在唯一索引基礎上,主鍵列的值不能會null。

//直接建立索引

create fulltext index index_name on table_name(column(length))

//修改表結構建立索引

alter

table table_name add fulltext index_name on (column(length))

//建立表時建立索引

create

table table_name(

`id`

int(11) not

null auto_increment,

`name`

varchar(30) default

'',primary

key (`id`),

fulltext index_name(`name`)

);//刪除索引(沒有變化)

drop index index_name on table_name

//使用全文索引

match (column) against ('string')

組合索引指的是多個列組合成為乙個索引。組合索引必須使用最左字首,否則索引失效。如索引(a,b,c,d),在查詢時where a=1 and b=2 and c=3會使用索引,where a=1 and c=3不會使用索引,where a=1 and b=2 and c>4 and d=2會使用索引abc。對於最後一種情況,當某個列使用範圍查詢時,其後面所有列都不會使用查詢(注,列指的是索引中的列)。

最左字首匹配。mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度就是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃瞄10條記錄

盡量不要對該列進行運算,不要呼叫函式,這樣會使索引失效。

單列索引不儲存null值,復合索引不儲存全為null的值。索引不能儲存null,所以對這列採用is null條件時,因為索引上根本沒null值,不能利用到索引,只能全表掃瞄。

前導模糊查詢不能利用索引。(like 『%a』)

or條件查詢時,有其中乙個不是索引列則其他所有索引失效。如有索引(a),(b),查詢條件where a=1 or b=3 會使用索引,where a=1 or b=1 or c=3全部索引失效。

組合索引沒有使用最左字首進行查詢。

索引列是字串,在查詢時沒有使用單引號引住查詢內容。如where string=』188』會使用索引,where string=188不會使用索引。

全表掃瞄比索引快不會使用索引。

在索引列上進行運算或使用函式,索引失效。如where id=id+1 ,where id=rand_num()都會索引失效。

使用<>,not in運算,索引失效。

使用hash型別索引時,進行範圍查詢或order by,索引失效。

表關聯時,關聯字段型別,長度不一致會使索引失效。

最好的做法是,將寫出的sql語句使用explain來檢視一下該語句的執**況。

MySQL索引介紹

索引由資料庫表中一列或者多列組合而成,其作用是提高對錶中資料的查詢速度。建立索引是指在某個表的一列或者多列上建立乙個索引,用來提高對錶的訪問速度,建立索引由三種方法 在建立表的時候建立,在已存在的表上建立和用alter table語句建立。建立索引的基本語法格式 asc引數表示公升序排列,desc引...

MySQL索引介紹

簡單理解為 排好序的快速查詢資料結構 一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。我們平常所說的索引,如果沒有特別指明,一般都是指b樹結構組織的索引 b 樹索引 b 樹索引檢索原理 1 類似圖書館書目索引,提高資料檢索的效率,降低資料庫的io成本。2 ...

Mysql索引介紹

索引是在建立表的時候會自動生成乙個主鍵 以主鍵生成的 索引,所以我們可以直接搜尋索引 我們也可以建立 普通索引 create index t job index on e user t job 建立索引名 被建立的表 建立的列名 格式 所以索引可以多個.刪除普通索引 drop index t job...