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