mysql 資料庫索引(基礎)

2021-10-05 21:07:46 字數 3281 閱讀 7837

類別 :

normal

表示普通索引 短列較為合適

unique

約束唯一標識資料庫表中的每一條記錄,即在單錶中不能用每條記錄是唯一的(例如身份證就是唯一的),unique(要求列唯一)和

spatial

空間索引適配特殊字段

fulltext

表示全文收索,在檢索長文字的時候,效果最好,短文本建議使用index,但是在檢索的時候資料量比較大的時候,現將資料放入乙個沒有全域性索引的表中,然後在用create index建立的full text索引,要比先為一張表建立full text然後在寫入資料要快的很多 

索引方法:

(1)hash 索引僅僅能滿足」=」,」in」和」<=>」查詢,不能使用範圍查詢。

由於 hash 索引比較的是進行 hash 運算之後的 hash 值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的 hash 演算法處理之後的 hash 值的大小關係,並不能保證和hash運算前完全一樣。

(2)hash 索引無法被用來避免資料的排序操作。

由於 hash 索引中存放的是經過 hash 計算之後的 hash 值,而且hash值的大小關係並不一定和 hash 運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

(3)hash 索引不能利用部分索引鍵查詢。

對於組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合併後再一起計算 hash 值,而不是單獨計算 hash 值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用。

(4)hash 索引在任何時候都不能避免表掃瞄。

前面已經知道,hash 索引是將索引鍵通過 hash 運算之後,將 hash運算結果的 hash 值和所對應的行指標資訊存放於乙個 hash 表中,由於不同索引鍵存在相同 hash 值,所以即使取滿足某個 hash 鍵值的資料的記錄條數,也無法從 hash 索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。

(5)hash 索引遇到大量hash值相等的情況後效能並不一定就會比b-tree索引高。

對於選擇性比較低的索引鍵,如果建立 hash 索引,那麼將會存在大量記錄指標資訊存於同乙個 hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。

索引建立規則:

1.選擇唯一性索引

2.為經常需要排序、分組和聯合操作的字段建立索引

3.為常作為查詢條件的字段建立索引

4.限制索引的數目

5.盡量使用資料量少的索引

6.盡量使用字首來索引

7.刪除不再使用或者很少使用的索引

索引失效:

(1)組合索引未使用最左字首,例如組合索引(a,b),where b=b不會使用索引;

(2)like未使用最左字首,where a like '%china';

(3)搜尋乙個索引而在另乙個索引上做order by,where a=a order by b,只使用a上的索引,因為查詢只使用乙個索引 ;

(4)or會使索引失效。如果查詢字段相同,也可以使用索引。例如where a=a1 or a=a2(生效),where a=a or b=b(失             效)

(5)如果列型別是字串,要使用引號。例如where a='china',否則索引失效(會進行型別轉換);

(6)在索引列上的操作,函式(upper()等)、or、!=(<>)、not in等;

explain 的使用:

expain  出的資訊有10個,分別是id、select_type、table、type、possible_keys、key、key_len、ref、rows、extra

他們分別代表的含義:

id:    代表執行順序   相同的順序執行,其他的數字越高執行的優先順序越大

select_type:表示查詢的型別。

(1) ******(簡單select,不使用union或子查詢等)

(2) primary(查詢中若包含任何複雜的子部分,最外層的select被標記為primary)

(3) union(union中的第二個或後面的select語句)

(4) dependent union(union中的第二個或後面的select語句,取決於外面的查詢)

(5) union result(union的結果)

(6) subquery(子查詢中的第乙個select)

(7) dependent subquery(子查詢中的第乙個select,取決於外面的查詢)

(8) derived(派生表的select, from子句的子查詢)

(9) uncacheable subquery(乙個子查詢的結果不能被快取,必須重新評估外鏈結的第一行)

table: 輸出結果集的表

partitions:匹配的分割槽

type:表示表的連線型別

對錶訪問方式,表示mysql在表中找到所需行的方式,又稱「訪問型別」。

常用的型別有:all、index、range、 ref、eq_ref、const、system、null(從左到右,效能從差到好)

all:full table scan, mysql將遍歷全表以找到匹配的行

index: full index scan,index與all區別為index型別只遍歷索引樹

range:只檢索給定範圍的行,使用乙個索引來選擇行

ref: 表示上述表的連線匹配條件,即哪些列或常量被用於查詢索引列上的值

eq_ref: 類似ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連線中使用primary key或者 unique key作為關聯條件

const、system: 當mysql對查詢某部分進行優化,並轉換為乙個常量時,使用這些型別訪問。如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量,system是const型別的特例,當查詢的表只有一行的情況下,使用system

null: mysql在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從乙個索引列裡選取最小值可以通過單獨索引查詢完成。

possible_keys:表示查詢時,可能使用的索引

key:表示實際使用的索引

key_len:索引欄位的長度

ref:列與索引的比較

rows:估算結果查出要掃瞄的行數(估算的行數)

filtered:按表條件過濾的行百分比

它指返回結果的行佔需要讀到的行(rows列的值)的百分比。

extra:執**況的描述和說明

摘抄的,僅供學習

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

mysql更新索引庫 Mysql資料庫索引增刪改查

一.索引的作用 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。在資料量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當資料量和訪問量劇增的...

MySQL資料庫索引

mysql資料庫索引 目錄 1 myisam與innodb的區別 2 索引的優缺點 3 如何選用索引 4 檢視索引 5 雜湊索引 6 b 樹 7 索引分類 1 myisam與innodb的區別 1 show engines 圖1.1 截圖1 a mysql資料表主要支援如圖所示的儲存引擎,分為 事務...