一.mysql索引是什麼?
1.索引:對資料庫中一列或多列的值進行排序的一種資料結構
2.作用:使用索引,可以讓資料庫系統不必掃瞄整個表,而是直接定位到符合條件的記錄,這樣就大大加快了查詢速度
mysql索引:是一種幫助mysql高效獲取資料的資料結構,這些資料結以某種方式引用資料,這種結構就是索引,可簡單理解為排好順序的快速查詢資料結構.
例如:select * from table where id=10000;
這樣子如果沒有索引的話,就會遍歷查詢整個表,直到id=10000這一行被找到位置,但是給id列加了索引以後,即可在索引中查詢,由於索引是由某種演算法優化過的,因為查詢次數要少的多,可見索引是用來定位的.
索引的效率取決於索引列的值是否雜湊,即該列的值如果越是互相不同,那麼索引的效率越高,反過來,如果記錄列存在大量相同的值,那麼對該列加索引就沒有什麼意義了.
myisam:儲存資料和索引是分開的, innodb的時候索引和資料是在一塊儲存的 myisam查詢資料的時候,先拿查索引值,再查資料,innodb是拿到索引就拿到資料了
二.索引如何建立?mysql索引有哪些型別?
索引類別:單值索引(index):唯一索引(unique),復合索引(又稱組合索引),主鍵索引(promary key)
建索引語句:create [unique|fulltext|spatial] index 索引名 on 表名
單值索引:(index):乙個索引包含乙個列,一張表可以建立多個
唯一索引:(unique):索引列的值必須唯一,但允許有空值
復合索引:(又稱組合索引):乙個索引包含多個列
主鍵索引:(promark key):關聯式資料庫會自動對齊建立主鍵索引,使用主鍵索引的效率最高,因為主鍵索引會保證絕對的唯一
mysql規範命名:唯一索引建議命名為:uk_欄位名,普通索引命名則為idx_欄位名(uk_即unique key idx_即index的簡稱)
檢視已建的索引:
fow index from 表名:
三.如何使用索引,提高索引命中率?
索引是為了提高檢索資料的速度,一般查詢的時候會根據我們where後的條件字段是否存在索引來觸發索引的使用
select * from t_sys_user where id+20;不會使用索引,索引列參加了計算
select * from t_sys_user where id like 『%1%』;不會使用索引 ,
正規表示式不會使用索引,這應該是很好理解的,所以這就是sql中很難看到regexp關鍵字的原因
字串與數字比較不使用索引
select * from t_sys_user where id=20 or name=『zhangsan』;如果條件中有or 即使其中包含索引,也不會使用索引
mysql 內部會對sql進行優化,如果優化器估計全表查詢會被使用索引更快,則不使用索引
組合索引遵循最左字首的原則
四.explain
explain+sql 會查詢索引計畫
id:select 查詢到序列號,包含一組數字,表示查詢中select子句或操作表的順序。
id有三種值:決定表的讀取順序
(1)id相同,表執行順序由上到下,與sql中順序無關
(2)id不同,id的序號會遞增,id值越大優先順序越高,越先被執行
(3)id 如果相同,可以認為是一組,從上往下順序執行;(衍生 = derived)
在所有組中,id值越大,優先順序越高,越先執行
select_type 一般有六種類別
(1)****** 簡單查詢,查詢中不包含子查詢或者union等任何複雜查詢
(2)primary 查詢中若包含任何複雜的子查詢,則最外層被標記為paimary,俗稱是雞蛋殼
(3)subquery 在select或where列表包含了子查詢
(4)derived 在from列表中包含的子查詢被標記為derived(衍生),mysql會遞迴執行這些子查詢,把結果放在臨時表裡(臨時表會增加系統負擔,但有時不得不用)
(5)union 若第二個select出現在union之後,則被標記為union;若union包含在from子句的子查詢中,外層select將被標記為:derived
(6)union result 兩種union結果的合併
type 訪問型別判斷(跟語句效能息息相關),顯示查詢使用了何種型別 不要為了優化而優化
從最好到最差依次是:system > const > eq_ref > ref > range > index > all(全表掃瞄)
一般來說,得保證查詢級別至少達到range級別,最好能達到ref
(1)system 表只要一行記錄(等於系統表),這是const型別的特例,平時不會出現,這個也可以忽略不計
(2)const 表示通過索引一次就找到了,const用於比較primary key 或者 unique索引,因為只匹配一行資料,所以很快,如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量。
(3)eq_ref 唯一性索引掃瞄。對於每個索引建,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄
(4)ref 非唯一性索引掃瞄,返回匹配某個單獨值得所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨值得行,然而它可能會找到多個符合條件的行,所以他應該屬於查詢和掃瞄的混合體
(5)range 只檢索給定範圍的行,使用乙個索引來選擇行,key 列顯示使用了哪個索引,一般就是你的where語句**現了between、、in等的查詢(mysql5.7支援in走索引),這種範圍掃瞄索引掃瞄比全表掃瞄好,因為它至於要開始索引的某一點,而結束語另一點,不用掃瞄全部索引
(6)index full index scan(全索引掃瞄),index與all區別為index型別只遍歷索引樹,這通常比all塊,因為索引檔案通常比資料檔案小。(也就是說雖然all和index都是讀全表,單index是從索引中讀取的,而all是從硬碟中讀的)
(7)all 全表掃瞄
possible_keys 顯示可能應用在這張表中的索引,乙個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用
key 實際上使用到的索引,如果為null,則沒有使用索引
查詢中若使用了(覆蓋索引),則該索引僅出現在key列表中,
覆蓋索引:
就是說我select 欄位1,欄位2,與我建立的符合索引個數和順序一致。例如:建的索引 欄位一 欄位二,查的也是字段
一、欄位二。理解方式一:就是select 的資料列只用從索引中就能夠取得,不必讀取資料行,mysql可以利用索引返回select列表中的字段,而不必根據索引再次讀取資料檔案,換句話說查詢列要被所建的索引覆蓋,乙個索引包含了(或覆蓋了)滿足查詢結果的資料就叫做覆蓋索引。
注意:如果要使用覆蓋索引,一定要注意select列表中只取出需要的列,不可select * ,因為如果將所有字段一起做索引會導致索引檔案過大,查詢效能下降。索引的字段不只包含查詢列,還需要包含查詢條件、排序等。
key_len :表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好。
key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的。
ref :顯示索引的哪一列被使用了,如果可能的話,是乙個常數。哪些列或常量被用於查詢索引列上的值
rows:根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數(越少越好),每張表有多少行被優化器查詢
extra:包含不適合在其他列顯示但是很重要的額外資訊
(1)using filrsort(九死一生)
說明mysql會對資料使用乙個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序操作稱為"檔案排序",一旦出現這種情況很危險。
(2)using index
使用到了索引、這種情況是好事。表示響應的select操作中使用了覆蓋索引(cocering index),避免訪問了表的資料行,效率不錯!如果同時出現了using where,表名索引被用來執行索引鍵值的查詢;如果沒有同時出現using where,表名索引用來讀取資料而非執行查詢動作。
(3)using where
使用了where條件
(4)using temporary(十死無生)
使用了臨時表儲存中間結果。mysql在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢 group by。(group by 最好與索引的字段、順序一致)
範圍(> < in)可能導致索引失效
左連線索引加在右表
右連線索引加在左表
MySQL聚集索引詳解 mysql 索引詳解
直接起飛 1.什麼是索引?索引是幫助mysql高效獲取資料的排好序的資料結構。2.索引的資料結構?為什麼選這種結構?假設我們現在這裡有一張表 以下情況都是innodb儲存引擎 idnumber 如果mysql沒有索引這種結構,那麼我們如果查詢number為51的這行記錄,那麼mysql就要從上往下掃...
MySQL聚集索引詳解 mysql索引詳解
資料結構分,有b tree索引 b tree 雜湊索引 r tree索引等。按資料塊的順序和索引節點的邏輯順序是否一致可以分為聚集索引和非聚集索引。聚集索引由於物理塊連續,在範圍掃瞄的時候可以減少磁頭尋道時間,因而比非聚集索引高效。幾種索引型別的選擇 primary 主鍵索引。unique 唯一索引...
MYSQL詳解(5) 索引(一)
一.什麼是索引 1.索引 索引是表的目錄,在查詢內容之前可以先在目錄中查詢索引位置,以此快速定位查詢資料 對於索引,會儲存在另外的檔案中。2.索引是資料庫中專門用於幫組使用者快速查詢資料的一種資料結構,類似於字典的目錄,查詢字典內容時,可以根據目錄查詢到資料的存放位置,然後快速定位 3.a.索引可以...