我們先來了解mysql索引的概念:
索引是一種特殊的檔案,他們包含著對資料表裡所有記錄的引用指標。更通俗地說,資料庫索引好比是是一本書前面的目錄,能加快資料庫的查詢速度,我們有了相應的索引後,資料庫會直接在索引中查詢符合條件的選項。索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了,聚簇索引能提高多行檢索的速度,而非聚簇索引對單行的檢索很快。
mysql主要有兩種結構:b+樹和hash
hash索引在mysql中較少用,它以把資料的索引以hash形式組織起來,因此當查詢某一條記錄的時候,速度非常快。因為是hash結構,每個鍵只對應乙個值,而且是雜湊的方式分布,所以它並不支援範圍查詢和排序等功能。
b+樹:b+樹是mysql使用最頻繁的乙個索引資料結構,資料結構以平衡樹的形式來組織,因為是樹形結構,所以更適合用來處理排序,範圍查詢等功能。相對hash索引,b+樹在查詢單條索引的速度上雖然比不上hash索引,但是因為更適合排序等操作,所以更受使用者的歡迎。
mysql索引的型別:普通索引:
這是最基本的索引,它沒有任何限制,它有以下幾種建立方式:
(1)建立索引:
create index indexname on mytable(username(length));
(2)修改表結果:
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 index_nameon table
2.唯一索引:
與前面的普通索引類似,不同的是:索引列的值必須唯一,但允許有空值,如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:
(1)建立索引:
create unique index indexname on mytable(username(length))
(2)修改表結構:
alter mytable add unique[indexname] on(username(length))
(3)建立表的時候直接指定:
create table mytable(id int not null,username varchar(16) not null,unique [indexname](username(length)))
3.主鍵索引:
這是一種特殊的唯一索引,不允許有空值,一般是在建表的時候,建立主鍵索引:
create table mytable (id int not null,username varchar(16) not null,primary key(id));
這裡要注意,乙個表只能有乙個主鍵。
4.組合索引:
為了形象對比單列索引和組合索引,為表新增多個字段:
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_ciry_age(name(10),city,age)
我們建表時username長度為16,這裡用10,這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高insert的更新速度。如果分別在username,city,age上建立單列索引,讓該錶有3個單列索引,查詢時和上述的組合索引效率也會不打一樣,遠遠低於我們的組合索引。
使用索引的注意事項:
1.索引不會包含有null值的列:只要列中包含有null值,都將不會被包含在mysql索引中,符合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的,所以我們在資料庫設計時不要讓字段的預設值為null。
2.使用短索引:對串列進行索引,如果可能應該指定乙個字首長度。短索引不僅可以提高查詢速度,而且可以節省磁碟空間和i/o操作。
3.索引列排序:mysql查詢只使用乙個索引,因此如果where子句中已經使用了索引的話,,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下,不要使用排序操作,盡量不要包含多個列的排序操作,如果需要最好給這些列建立復合索引。
4.不要在列上進行運算,這將導致索引失效而進行全表掃瞄。
mysql各種索引區別:
普通索引:最基本的索引,沒有任何限制;
唯一索引:與普通索引類似,不同的是,索引列的值必須唯一,但允許有空值;
主鍵索引:它是一種特殊的唯一索引,不允許有空值;
全文索引:僅可用於myisam表,針對較大的資料,生成全文索引,很耗時耗空間;
組合索引:為了更高的提高mysql效率可建立組合索引,遵循「最左字首」原則。
關於MySQL索引
給字段加索引 隨著資料表數量的增加,沒錯查詢的速度逐漸變慢,這是就需要給資料表需要 where 的字段加上索引。分析索引過多帶來的問題 可是隨著索引的字段越來越多,查表的速度也變得越來越慢,這時候就要使用 mysql 的 explain 來檢視具體使用的索引是哪個 由於單個索引過多,使我們能通過索引...
關於mysql聯合索引
create table uniontest id int 11 not null auto increment,menuname varchar 50 default null,url varchar 200 default null,primary key id unique key u ind...
mysql思考7 關於Uber選擇MySQL的思考
在資料庫圈子,大家都知道今年uber幹出來一件大事件,把postgresql切換到了mysql,當時社群裡一陣喧嘩。事情已經過去半年多了,這裡我不想去和大家再次討論這兩個關係型資料庫那個更好。只是想帶著大家思考一下選擇的背後。在該事件中,uber提出來遷移的乙個重要原因是 在大量更新的業務場景下po...