Mysql索引介紹及常見索引的區別

2021-09-11 06:27:33 字數 2545 閱讀 2049

mysql索引概念:

說說mysql索引,看到乙個很少比如:索引就好比一本書的目錄,它會讓你更快的找到內容,顯然目錄(索引)並不是越多越好,假如這本書1000頁,有500也是目錄,它當然效率低,目錄是要佔紙張的,而索引是要佔磁碟空間的。

mysql索引主要有兩種結構:b+tree索引和hash索引.

hash索引

mysql中,只有memory(memory表只存在記憶體中,斷電會消失,適用於臨時表)儲存引擎顯示支援hash索引,是memory表的預設索引型別,儘管memory表也可以使用b+tree索引。hsah索引把資料的索引以hash形式組織起來,因此當查詢某一條記錄的時候,速度非常快。當時因為是hash結構,每個鍵只對應乙個值,而且是雜湊的方式分布。所以他並不支援範圍查詢和排序等功能。

b+樹索引

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差很多。

1、選擇索引的資料型別

(1)越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和cpu快取中都需要更少的空間,處理起來更快。

(2)簡單的資料型別更好:整型資料比起字元,處理開銷更小,因為字串的比較更複雜。在mysql中,應該用內建的日期和時間資料型別,而不是用字串來儲存時間;以及用整型資料型別儲存ip位址。

(3)盡量避免null:應該指定列為not null,除非你想儲存null。在mysql中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用0、乙個特殊的值或者乙個空串代替空值。

2、選擇主鍵型別

選擇合適的識別符號是非常重要的。選擇時不僅應該考慮儲存型別,而且應該考慮mysql是怎樣進行運算和比較的。一旦選定資料型別,應該保證所有相關的表都使用相同的資料型別。

(1)    整型:通常是作為識別符號的最好選擇,因為可以更快的處理,而且可以設定為auto_increment。

(2)    字串:盡量避免使用字串作為識別符號,它們消耗更好的空間,處理起來也較慢。而且,通常來說,字串都是隨機的,所以它們在索引中的位置也是隨機的,這會導致頁面**、隨機訪問磁碟,聚簇索引**(對於使用聚簇索引的儲存引擎)。

mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引

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` ) 

mysql各種索引區別:

普通索引:最基本的索引,沒有任何限制

唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。

主鍵索引:它 是一種特殊的唯一索引,不允許有空值。 

全文索引:僅可用於 myisam 表,針對較大的資料,生成全文索引很耗時好空間。

組合索引:為了更多的提高mysql效率可建立組合索引,遵循」最左字首「原則。建立復合索引時應該將最常用(頻率)作限制條件的列放在最左邊,依次遞減。

組合索引最左字段用in是可以用到索引的,最好explain一下select。

MySQL 索引介紹及索引的分類 索引原則

索引的使用 1.在建立表的時候給字段增加索引.2.建立表完畢後,增加索引.use school show index from student 顯示所有的索引資訊 增加乙個全文索引 索引名 列名 alter table student add fulltext index studentname s...

MYSQL 索引的介紹及使用

mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構。提取句子主幹,就可以得到索引的本質,索引是資料結構。對於索引,我們理解成目錄都可以,就像一本書的目錄,當我們需要查詢書中某個資料時,如果對書本不了解,我們直接找肯定會很費勁,但是如果我們先找目錄,查詢的速度就會提...

MySQL索引介紹

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