資料庫索引
一、索引的概念
索引是一種排好序的快速查詢的資料結構。
索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。
我們平常所說的索引,如果沒有特別指明,都是指b樹(多路搜尋樹,並不一定是二叉的)結構組織的索引。其中聚集索引、次要索引、覆蓋索引、復合索引、字首索引、唯一索引 預設都是使用b+樹索引,統稱為 索引。當然除了 b+樹 這種型別的索引之外,還有雜湊索引(hash index)等。
二、索引的優缺點
優點:1)提高資料檢索的效率,降低資料庫的io成本
2)通過索引列對資料進行排序,降低資料排序的成本,降低了cpu的消耗
缺點:1)索引其實也是一張表,該錶儲存了主鍵與索引字段,並指向實體表的記錄,所以索引也是要占用空間的
2)索引雖然提高了查詢速度,但是卻降低了更新表的速度。因為更新表時,mysql不僅要儲存資料,還要儲存索引檔案。每次更新新增了索引列的字段。都會調整因為更新所帶來的的鍵值變化後的索引資訊。
三、explain
1.概念
用法:explain + sql 檢視執行計畫包含的資訊
例如:
explain select * from admin;
1)檢視表的讀取順序
2)資料讀取操作的操作型別
3)哪些索引可以使用
4)哪些索引被實際使用
5)表之間的引用
6)每張表有多少行被優化器查詢
2.各欄位解釋
1)id
id相同,執行順序由上至下
id不同,id值越大越早執行
2)select_type
****** -----------------------普通查詢,查詢中不包含子查詢或者union
primary-----------------------查詢中包含任何複雜的子部分,最外層查詢被標記為primary
subquery---------------------查詢中包含任何複雜的子部分,內層查詢被標記為subquery
derived-----------------------在from列表中包含的子查詢被標記為derived(衍生),mysql會遞迴執行這些子查詢,把結果放在臨時表中
union--------------------------若第二個select出現在union之後,則被標記為union;若union包含在from子句的子查詢中,外層select將被標記為derived
union result------------------從union表獲取結果的select
3)type
從最好到最差的排序為:
system --> const --> eq_ref --> ref --> range --> index --> all
一般來說,得保證查詢至少達到range級別,最好能達到ref
1.system :
表只有一行記錄(等於系統表),這是const型別的特例,平時不會出現,這個也可以忽略不計
2.const:
表示通過索引一次就找到了,const用於比較 primary key 或者 unique 索引。因為只匹配一行資料,所以很快。
唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄。
4.ref
非唯一性索引掃瞄,返回匹配某個單獨值的所有行。
5.range
只檢索給定範圍的行,使用乙個索引來選擇行。一般在 between 、< 、> 、in 等的查詢
6.index
full index scan,index與all的區別為 index型別只遍歷 索引樹。通常比all快,因為索引檔案通常比資料檔案小。
全表掃瞄
顯示可能應用在這張表中的索引,乙個或多個。查詢涉及到的字段上若涉及索引,則該索引將被列出,但不一定被查詢實際使用
key實際使用的索引。如果為null,則沒有使用索引
四、索引失效的原因
1)在索引列上做操作(計算、函式、型別轉換),會導致索引失效而轉向全表掃瞄
2)使用 != 或者 <> 的時候會失效
3)is null /is not null 會失效
4)like 以萬用字元 『%abc…』 會失效(若使用右模糊查詢(『abd…%』),則可以使用索引)
注:使用覆蓋索引可以使用 %abc…%
5)字串不加單引號會失效
6)用 or 連線 會失效
7)復合索引,左側的不能斷
注:索引兩大功能:檢索(select) 和排序(order by)
group by 基本上都需要進行排序,會有臨時表產生
索引檢索(where 之後,order by之前的條件)優化口訣:
索引排序(order by 之後)優化:
1)order by時 ,不要使用 **select ***
2)嘗試提高 sort_buffer_size 的大小
每次讀取到 sort_buffer 的記憶體資料容量大小
3)合理設定 max_length_for_sort_data 的大小
日誌分析工具 mysqldumpslow :
資料庫索引 索引優化
二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...
資料庫索引的原理及優化
在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。索引的實現通常使用b樹及其變種b 樹。b 樹...
資料庫優化 索引
鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至 2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表 如 sysobjects等 就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。資料庫中,目錄 資料字典 和索引的區別 目錄縱向 索引橫向。優化器根據統...