mysql官方對索引的定義:
索引(index)是幫助mysql高效獲取資料的資料結構(有序)。在資料之外,資料庫系統還維護著某種特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引。
一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。索引是資料庫中用來提高效能的最常用的工具..
.索引優勢劣勢
優勢
1 . 類似於書籍的目錄索引,提高資料檢索的效率,降低資料庫的io成本。
2. 通過索引列對資料進行排序,降低資料排序的成本,降低cpu的消耗
劣勢
1 . 實際上索引也是一張表,該表中儲存了主鍵與索引字段,並指向實體類的記錄,所以索引列也是要占用空間的
2. 雖然索引大大提高了查詢效率,同時也降低更新表的速度,如對表進行insert、update、delete。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案每次更新新增了索引列的字段,都會調整因為更新所帶來的鍵值變化後的索引資訊..
.索引結構
索引是在mysql的儲存引擎層中實現的,而不是在伺服器層實現的。所以每種儲存引擎的索引都不一定相同,也不是所有的儲存引擎都支援所有的索引型別。mysql目前提供了以下4種索引:
btree索引:最常見的索引型別,大部分索引都支援b樹索引
hash索引:只有memory引擎支援,使用場景簡單
r-tree索引(空間索引):空間索引是myisam引擎的乙個特殊索引型別,主要用於地理空間資料索引 ,通常使用較少,不做特別介紹。
full-text(全文索引):全文索引也是myisam的乙個特殊索引型別,主要用於全文索引,innodb5.6開始支援
我們平常所說的索引,如果沒有特別指明,都是指b+樹(多路搜尋樹,並不一定是二叉的)結構組織的索引。其中聚集索引、復合索引、字首索引、唯一索引預設都是使用b+tree樹索引,統稱為索引..
.btree結構
btree又叫多路平衡搜尋樹,一顆m叉的btree特性如下:
1. 樹中每個結點最多包含m個孩子
2. 除根結點與葉子結點外,每個結點至少有m/2向上取整個孩子
3. 若根結點不是葉子結點,則至少有兩個孩子
4. 所有的葉子結點都在同一層
5. 每個非葉子結點由n個key與n+1個指標組成,其中n>=m/2向上取整 && n <= m-1
btree樹和二叉樹相比,查詢資料的效率更高,因為對於相同的資料量來說,rtree的層級結構比二叉樹小,因此搜尋速度快。..
.b+tree結構
b+tree是btree的變種,b+tree與btree的區別為:
1 . n叉b+tree最多包含有n個key,而btree最多包含有n-1個key
2 .b+tree的葉子結點儲存所有的key資訊,依key大小順序排列
3 .所有的非葉子結點都可以看作是key的索引部分
由於b+tree只有葉子結點儲存key資訊,查詢任何key都要從root走到葉子。所以b+tree的查詢效率更加穩定
.mysql索引資料結構對經典的b+tree進行了優化。在原b+tree的基礎上,增加了乙個指向相鄰葉子結點的鍊錶指標,就形成了帶有順序指標的b+tree,提高區間訪問的效能..
.索引分類
1 . 單值索引:即乙個索引只包含單個列,乙個表可以有多個單列索引
2 . 唯一索引:索引列的值必須唯一,但允許有空值
3 . 復合索引:即乙個索引包含多個列..
.索引語法
索引在建立表的時候,可以同時建立,也可以隨時增加新的索引
.建立索引
語法:create [unique|fulltext|spatial] index index_name
[using index_type]
on tbl_name(index_col_name,…)
index_col_name : column_name[(length)][asc | desc]
例:create index_city_name on city(city_name);
.檢視索引
語法:show index from table_name;
.刪除索引
語法:drop index index_name on tbl_name;
.alter命令
1 . alter table tb_name add primary key(column_list);
該語句新增乙個主鍵,這意味著索引值必須是唯一的,且不能為null
2 . alter table tb_name add unique index_name(column_list);
這條語句建立索引的值必須是唯一的(除了null外,null可能會出現多次)
3 . alter table tb_name add index index_name(column_list);
新增普通索引,索引值可以出現多次
4 . alter table tb_name add fulltext index_name(column_list);
該語句指定了索引為fulltext, 用於全文索引..
.索引設計原則
索引的設計可以遵循一些已有的原則,建立索引的時候請盡量考慮符合這些原則,便於提公升索引的使用效率,更高效的使用索引。
1. 對查詢頻次較高,且資料量比較大的表建立索引。
2. 索引欄位的選擇,最佳候選列應當從where子句的條件中提取,如果where子句中的組合比較多,那麼應當挑選最常用、過濾效果最好的組合。
3. 使用唯一索引,區分度越高,使用索引的效率越高
4. 索引可以有效的提公升查詢資料的效率,但索參數量不是多多益善,索引越多,維護索引的代價自然就水漲船高。對於插入、更新、刪除等dml操作比較頻繁的表來說,索引過多,會引入相當高的維護代價,降低dml操作的效率。另外索引過多的話,mysql也會選擇困難病,雖然最終仍然會找到乙個可用的索引,但無疑提高了選擇的代價
5. 使用短索引,索引建立之後也是用硬碟來儲存的,因此提公升索引訪問的i/o效率,也可以提公升總體的訪問效率。假如構成索引的字段總程度比較短,那麼在給定大小的儲存塊內可以儲存更多的索引值,相應的可以有效的提公升mysql訪問索引的i/o效率
6. 利用最左字首,n個列組合而成的組合索引,那麼相當於是建立了n個索引,如果查詢時where子句中使用了組成該索引的前幾個字段,那麼這條查詢sql可以利用組合索引來提公升查詢效率
建立復合索引:
create index idx_name_email_status on tb_seller(name, email, status);
就相當於
對name 建立索引;
對name, email 建立了索引;
對name,email,status 建立了索引
mysql高階索引 Mysql高階 索引優化全解
是否會使用索引,是mysql的關鍵 1.sql效能下降原因查詢語句寫的不好,連線子查詢太多,沒有建索引等等 索引失效 關聯jion表過多 伺服器引數設定不合適2.索引優化 索引是什麼?索引就是一種排好序的查詢資料結構,常見模型有雜湊表 有序陣列 二叉搜尋樹 目前最常用的innodb引擎使用的模型是b...
mysql 高階 索引
綠色代表值,黃色代表指標,藍色為磁碟塊,灰色表示沒有對應區域的資料。磁碟塊1中,p1指向數值小於17的磁碟塊,p2指向數值大於17小於35的磁碟塊,p3指向大於35的磁碟塊 尋找值為29 磁碟塊1中,29大於17小於35,由磁碟塊1的p2指向磁碟塊3 磁碟塊3中,29大於36小於30,由磁碟塊3的p...
mysql高階 索引
四 關於索引的sql 優點 可以快速的檢索 可以加快分組和排序 缺點 占用儲存空間 降低資料表的修改操作主鍵索引 即主索引,根據主鍵 pk clolum length 建立索引,不允許重複,不允許空值 唯一索引 用來建立索引的列的值必須是唯一的,允許空值 普通索引 用表中的普通列構建的索引,沒有任何...