索引是在儲存引擎由於快速查詢記錄的一種資料結構。
索引有很多種型別,可以為不同的場景提供更好的效能。在mysql中,索引是在儲存引擎層而不是在伺服器層實現的。所以沒有統一的索引標準:不同儲存引擎的索引的工作方式並不是一樣的,也不是所有的儲存引擎都支援所有型別的索引。即使多個儲存引擎都支援同一種型別索引,底層實現也不一定是相同的。
mysql索引主要有兩種結構:b+tree索引和hash索引.
mysql中,只有memory(memory表只存在記憶體中,斷電會消失,適用於臨時表)儲存引擎顯示支援hash索引,是memory表的預設索引型別,儘管memory表也可以使用b+tree索引。hsah索引把資料的索引以hash形式組織起來,因此當查詢某一條記錄的時候,速度非常快。當時因為是hash結構,每個鍵只對應乙個值,而且是雜湊的方式分布。所以他並不支援範圍查詢和排序等功能。
b+tree是mysql使用最頻繁的乙個索引資料結構,是inodb和myisam儲存引擎模式的索引型別。相對hash索引,b+樹在查詢單條記錄的速度比不上hash索引,但是因為更適合排序等操作,所以他更受使用者的歡迎。畢竟不可能只對資料庫進行單條記錄的操作。
帶順序訪問指標的b+tree
b+tree所有索引資料都在葉子結點上,並且增加了順序訪問指標,每個葉子節點都有指向相鄰葉子節點的指標。
這樣做是為了提高區間查詢效率,例如查詢key為從18到49的所有資料記錄,當找到18後,只需順著節點和指標順序遍歷就可以一次性訪問到所有資料節點,極大提到了區間查詢效率。
大大減少磁碟i/o讀取
資料庫系統的設計者巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。
為了達到這個目的,在實際實現b- tree還需要使用如下技巧:
每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個node只需一次i/o。
b-tree中一次檢索最多需要h-1次i/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logdn)。一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3)。而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性,所以紅黑樹的i/o漸進複雜度也為o(h),效率明顯比b-tree差很多。
mysql支援很多資料型別,選擇合適的資料型別儲存資料對效能有很大的影響。通常來說,可以遵循以下一些指導原則:
(1)越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和cpu快取中都需要更少的空間,處理起來更快。
(3)盡量避免null:應該指定列為not null,除非你想儲存null。在mysql中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用0、乙個特殊的值或者乙個空串代替空值。
選擇合適的識別符號是非常重要的。選擇時不僅應該考慮儲存型別,而且應該考慮mysql是怎樣進行運算和比較的。一旦選定資料型別,應該保證所有相關的表都使用相同的資料型別。
(1) 整型:通常是作為識別符號的最好選擇,因為可以更快的處理,而且可以設定為auto_increment。
(2) 字串:盡量避免使用字串作為識別符號,它們消耗更好的空間,處理起來也較慢。而且,通常來說,字串都是隨機的,所以它們在索引中的位置也是隨機的,這會導致頁面**、隨機訪問磁碟,聚簇索引**(對於使用聚簇索引的儲存引擎)。
primary key(主鍵索引) alter table `table_name` add primary key ( `col` )
unique(唯一索引) alter table `table_name` add unique (`col`)
index(普通索引) alter table `table_name` add index index_name (`col`)
fulltext(全文索引) alter table `table_name` add fulltext ( `col` )
組合索引 alter table `table_name` add index index_name (`col1`, `col2`, `col3` )
普通索引:最基本的索引,沒有任何限制
唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
主鍵索引:它 是一種特殊的唯一索引,不允許有空值。
全文索引:僅可用於 myisam 表,針對較大的資料,生成全文索引很耗時好空間。
組合索引最左字段用in是可以用到索引的,最好explain一下select。
mysql 索引簡介
索引 是一種特殊的資料結構,可以用來快速查詢資料庫表中的特定記錄.是提高資料庫效能的重要方式.包括普通索引,唯一性索引,全文索引,單列索引,多列索引和空間索引.簡介 由資料庫表中的一列或多列組合而成,起作用是提高對錶中資料的查詢速度.設計原則 1.選擇唯一性索引 唯一性索引的值是唯一的,可以快速通過...
mysql索引簡介
參考資料 索引釋義 索引的分類 索引建立和刪除 索引的情景化應用 索引 index 是幫助mysql高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質 索引是資料結構。為什麼是索引,而不是直接的資料庫資料本身?查詢演算法只能應用於特定的資料結構,例如二分查詢適用於有序的資料,二叉樹查詢只能應...
mysql 索引簡介
索引 其實資料庫中的資料是按頁存放的 其實索引也是按頁存放的 所以本質上索引也佔硬碟空間 以最小的消耗,換取最大的利益 索引是一種有效組合資料的方式!為快速查詢到指定記錄做鋪墊 目的就是快速或者某個記錄!提高了資料庫的檢索速度!作用 大大提高資料庫的檢索速度 改善資料庫效能 mysql索引儲存型別分...