MySQL理解索引、添加索引的原則
[理解索引]
要理解索引,首先需要瞭解資料如何儲存在硬碟上。不同的儲存引擎採取的措施可能不一樣,比如MySQL用戶端預設採用MyISAM,該引擎為每個表建立單獨的檔案。
不管是否為每個表建立了單獨的檔案,作業系統從硬碟讀取資料到記憶體中總是以頁為單位的。因此,如果要擷取特定記錄,就需要把包含該記錄的頁讀入。
MySQL在擷取一條記錄的時候,可以採取逐條掃描或者索引訪問兩種不同的方法。假設採取第一種方法,要擷取id為1234的記錄,就需要順序地、依次地訪問過前1233條記錄。不僅如此,還需要考慮每次讀入資料頁的IO開銷。而如果採取索引,則可以根據索引指向的頁以及記錄在頁中的位置,迅速地讀取目標頁進而擷取目標記錄。
除了在擷取特定行的情況下使用hash十分快捷,在其它情況下都(預設)採用B樹來構建索引。B樹是平衡多叉樹,每個節點存放多少個值取決於值所佔的空間,這與每一張資料頁存放多少條記錄與記錄資訊量有關同理。節點中的值是以非降序進行排列的,節點中的值總是小於等於指向它的結點中的值。
MySQL使用B樹構造索引的情況下,是由葉子指向具體的頁和記錄的。並且一個葉子有一個指標指向下一個葉子。
使用索引需要注意:
⑴只對WHERE和ORDER BY需要查詢的欄位設定索引,避免無意義的硬碟開銷;
⑵複合式索引支援首碼索引;
⑶更新表的時候,如增刪記錄,MySQL會自動更新索引,保持樹的平衡;
一,索引的重要性
索引用於快速找出在某個列中有一特定值的行。不使用索引,MySQL必須從第1條記錄開始然後讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到資料檔案的中間,沒有必要看所有資料。注意如果你需要訪問大部分行,順序讀取要快得多,因為此時我們避免磁碟搜尋。
索引分三類:
index ----普通的索引,資料可以重複
unique ----唯一索引,唯一索引,要求所有記錄都唯一
primary key ----主鍵索引,也就是在唯一索引的基礎上相應的列必須為主鍵
MySQL 中會對 <,<=,=,>,>=,BETWEEN,IN 以及不以% _ 開頭的like 語句使用索引。
二,原則
1,單表資料太少,索引反而會影響速度
2,where後的條件,order by ,group by 等這樣過濾時,後面的欄位最好加上索引。根據實際情況,選擇PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要適度
3,聯集查詢,子查詢等多表操作時關連欄位要加索引
本文永久更新連結地址: