索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。
資料庫底層資料結構是b+樹,b+tree是乙個n叉樹,每個節點有多個葉子節點,一顆b+樹包含根節點,內部節點,葉子節點。根節點可能是乙個葉子節點,也可能是乙個包含兩個或兩個以上葉子節點的節點。
b+tree的性質:
1.n棵子tree的節點包含n個關鍵字,不用來儲存資料而是儲存資料的索引。
2.所有的葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序鏈結。
3.所有的非終端結點可以看成是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。
b+tree結構原型圖大概如下(引用):
包括普通索引,唯一索引,主鍵索引與主鍵索引,以及對這些索引的實際應用或是建立有乙個詳細介紹。
(1)普通索引
這是最基本的mysql資料庫索引,它沒有任何限制。它有以下幾種建立方式:
建立索引
create index indexname on mytable(username(length));如果是char,varchar型別,length可以小於字段實際長度;如果是blob和text型別,必須指定 length,下同。
修改表結構
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;(2)唯一索引它與前面的普通索引類似,不同的就是:mysql資料庫索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:
建立索引
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)) );(3)主鍵索引它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引:
create table mytable( id int not null, username varchar(16) not null, primary key(id) );當然也可以用 alter 命令。記住:乙個表只能有乙個主鍵。
(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_city_age (name(10),city,age); 建表時,usernname長度為 16,這裡用 10。這是因為一般情況下名字的長度不會超過10,這樣會加速索引查詢速度,還會減少索引檔案的大小,提高insert的更新速度。
如果分別在 usernname,city,age上建立單列索引,讓該錶有3個單列索引,查詢時和上述的組合索引效率也會大不一樣,遠遠低於我們的組合索引。雖然此時有了三個索引,但mysql只能用到其中的那個它認為似乎是最有效率的單列索引。
建立這樣的組合索引,其實是相當於分別建立了下面三組組合mysql資料庫索引:
usernname,city,age usernname,city usernname 為什麼沒有 city,age這樣的組合索引呢?這是因為mysql組合索引「最左字首」的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這三列的查詢都會用到該組合索引,下面的幾個sql就會用到這個組合mysql資料庫索引:
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="鄭州"
一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。 聚集索引確定表中資料的物理順序。聚集索引類似於**簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列(組合索引),就像**簿按姓氏和名字進行組織一樣。
聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第乙個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程式執行 的乙個查詢經常檢索某一日期範圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於提高此 類查詢的效能。同樣,如果對從表中檢索的資料進行排序時經常要用到某一列,則可以將該錶在該列上聚集(物理排序),避免每次查詢該列時都進行排序,從而節 省成本。
當索引值唯一時,使用聚集索引查詢特定的行也很有效率。例如,使用唯一雇員 id 列 emp_id 查詢特定雇員的最快速的方法,是在 emp_id 列上建立聚集索引或 primary key 約束。
一種索引,該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。索引是通過二叉樹的資料結構來描述的,我們可以這麼理解聚簇索引:索引的葉節點就是資料節點。而非聚簇索引的葉節點仍然是索引節點,只不過有乙個指標指向對應的資料塊。如下圖:
(非聚集索引)
聚集索引對應的缺點就是修改慢,因為為了保證表中記錄的物理和索引順序一致,在記錄插入的時候,會對資料頁重新排序。
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...