mysql高階 索引

2021-10-04 08:19:34 字數 4183 閱讀 3142

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 建立索引,不允許重複,不允許空值 唯一索引 用來建立索引的列的值必須是唯一的,允許空值 普通索引 用表中的普通列構建的索引,沒有任何...