mysql索引hash索引和b tree索引的區別

2021-09-01 22:47:11 字數 2525 閱讀 3902

mysql下增加索引的方式:

修改表結構:

alter mytable add index [indexname] on (username(length))

建立表結構

create table mytable( id int not null, username varchar(16) not null, index [indexname] (username(length)) );

刪除索引的語法:

drop index [indexname] on mytable;

下面是mysql具有的索引型別:

1、唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:

◆建立索引

create unique index indexname on mytable(username(length))

◆修改表結構

alter mytable add unique [indexname] on (username(length))

◆建立表的時候直接指定

create table mytable( id int not null, username varchar(16) not null, unique [indexname] (username(length)) );

2、主鍵索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引:

create table mytable( id int not null, username varchar(16) not null, primary key(id) ); 當然也可以用 alter 命令。記住:乙個表只能有乙個主鍵。

3、組合索引

為了形象地對比單列索引和組合索引,為表新增多個字段:

create table mytable( id int not null, username varchar(16) not null, city varchar(50) not null, age int not null ); 為了進一步榨取mysql的效率,就要考慮建立組合索引。就是將 name, city, age建到乙個索引裡:

alter table mytable add index name_city_age (name(10),city,age); 建表時,usernname長度為 16,這裡用 10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高insert的更新速度。

如果分別在 usernname,city,age上建立單列索引,讓該錶有3個單列索引,查詢時和上述的組合索引效率也會大不一樣,遠遠低於我們的組合索引。雖然此時有了三個索引,但mysql只能用到其中的那個它認為似乎是最有效率的單列索引。

建立這樣的組合索引,其實是相當於分別建立了下面三組組合索引:

usernname,city,age usernname,city usernname 為什麼沒有 city,age這樣的組合索引呢?這是因為mysql組合索引「最左字首」的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個sql就會用到這個組合索引:

select * from mytable whree username="admin" and city="鄭州" select * from mytable whree username="admin" 而下面幾個則不會用到:

select * from mytable whree age=20 and city="鄭州" select * from mytable whree city="鄭州"

建立索引的時機;

到這裡我們已經學會了建立索引,那麼我們需要在什麼情況下建立索引呢?一般來說,在where和join中出現的列需要建立索引,但也不完全如此,因為mysql只對<,<=,=,>,>=,between,in,以及某些時候的like才會使用索引。例如:

select t.name from mytable t left join mytable m on t.name=m.username where m.age=20 and m.city='鄭州' 此時就需要對city和age建立索引,由於mytable表的userame也出現在了join子句中,也有對它建立索引的必要。

剛才提到只有某些時候的like才需建立索引。因為在以萬用字元%和_開頭作查詢時,mysql不會使用索引。例如下句會使用索引:

select * from mytable where username like'admin%' 而下句就不會使用:

select * from mytable wheret name like'%admin' 因此,在使用like時應注意以上的區別。

使用索引時的注意事項:

1、預設可以為null的列,索引不起作用。

2、使用短索引,不能列的長度有多長,索引就建立多長

3、mysql查詢預設只使用乙個索引,如果加上排序的話,最好給他們加上覆合索引,要不然排序非常影響效率

4、不要在列上做運算,這樣會導致索引失效

5、不適用 not in 和<>

hash索引和B 索引區別

hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b tree 索引。可 能很多人又有疑問了,既然 hash 索引的效率要比 b tree 高很多,為什麼大...

B樹索引 hash索引

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。對於乙個表中幾百萬行資料來說,如果不使用索引,每次查詢都需要遍歷一遍所有的行,從而找到所需要的資料,平均查詢效率o n 如果使用了索引,在查詢時會先找索引,快速定位到磁碟位置,然後再去讀出該行的資料,效率大大...

Hash索引和B 樹索引的區別

我們都知道在mysql中索引的資料結構有兩種,一種是hash,另一種是btree。在資料表中建立什麼樣的索引需要我們根據實際情況進行選擇。b 樹結構示意圖 b 樹的特徵 1 有k個孩子的節點就有k個關鍵字。也就是孩子數量 關鍵字數。2 非葉子節點的關鍵字也會同時存在在子節點中,並且是在子節點中所有關...