系統崩潰下的Oracle 10g資料恢復全流程記錄
版本(5.0)
MyISAM和InnoDB儲存引擎的表預設建立的都是BTREE索引。MySQL目前還不支援函式索引,但是支援字首索引,即對索引欄位的前N個字元建立索引。字首索引的長度跟儲存引擎相關,對於MyISAM儲存引擎的表,索引的字首長度可以達到1000位元組長,而對於InnoDB儲存引擎的表,索引的字首長度最長是767位元組。請注意字首的限制應以位元組為單位進行測量,而CREATE TABLE語句中的字首長度解釋為字元數。
MySQL 中還支援全文字(FULLTEXT)索引,該索引可以用於全文搜尋。但是版本(5.0)中只有MyISAM儲存引擎支援FULLTEXT索引,並且只限於CHAR、VARCHAR和TEXT列。索引總是對整個列進行的,不支援區域性(字首)索引。
設計索引的原則
索引的設計可以遵循一些已有的原則,建立索引的時候請儘量考慮符合這些原則,便於提升索引的使用效率,更高效地使用索引。
搜尋的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出現在WHERE子句中的列,或連線子句中指定的列,而不是出現在SELECT關鍵字後的選擇列表中的列。
使用唯一索引。考慮某列中值的分佈。索引的列的基數越大,索引的效果越好。例如,存放出生日期的列具有不同值,很容易區分各行。而用來記錄性別的列,只含有“M”和“F”,則對此列進行索引沒有多大用處,因為不管搜尋哪個值,都會得出大約一半的行。
使用短索引。如果對字串列進行索引,應該指定一個字首長度,只要有可能就應該這樣做。例如,有一個CHAR(200)列,如果在前10個或20個字元內,多數值是唯一的,那麼就不要對整個列進行索引。對前10個或20個字元進行索引能夠節省大量索引空間,也可能會使查詢更快。較小的索引涉及的磁碟 IO 較少,較短的值比較起來更快。更為重要的是,對於較短的鍵值,索引快取記憶體中的塊能容納更多的鍵值,因此,MySQL 也可以在記憶體中容納更多的值。這樣就增加了找到行而不用讀取索引中較多塊的可能性。
利用最左字首。在建立一個n列的索引時,實際是建立了MySQL可利用的n個索引。多列索引可起幾個索引的作用,因為可利用索引中最左邊的列集來匹配行。這樣的列集稱為最左字首。
不要過度索引。不要以為索引“越多越好”,什麼東西都用索引是錯誤的。每個額外的索引都要佔用額外的磁碟空間,並降低寫操作的效能。在修改表的內容時,索引必須進行更新,有時可能需要重構,因此,索引越多,所花的時間越長。如果有一個索引很少利用或從不使用,那麼會不必要地減緩表的修改速度。此外,MySQL 在生成一個執行計劃時,要考慮各個索引,這也要花費時間。建立多餘的索引給查詢優化帶來了更多的工作。索引太多,也可能會使MySQL選擇不到所要使用的最好索引。只保持所需的索引有利於查詢優化。
對於InnoDB儲存引擎的表,記錄預設會按照一定的順序儲存,如果有明確定義的主鍵,則按照主鍵順序儲存。如果沒有主鍵,但是有唯一索引,那麼就是按照唯一索引的順序儲存。如果既沒有主鍵又沒有唯一索引,那麼表中會自動生成一個內部列,按照這個列的順序儲存。按照主鍵或者內部列進行的訪問是最快的,所以InnoDB表儘量自己指定主鍵,當表中同時有幾個列都是唯一的,都可以作為主鍵的時候,要選擇最常作為訪問條件的列作為主鍵,提高查詢的效率。另外,還需要注意,InnoDB 表的普通索引都會儲存主鍵的鍵值,所以主鍵要儘可能選擇較短的資料型別,可以有效地減少索引的磁碟佔用,提高索引的快取效果。
BTREE索引與HASH索引
HASH索引有一些重要的特徵需要在使用的時候特別注意,如下所示。
只用於使用=或<=>操作符的等式比較。
優化器不能使用HASH索引來加速ORDER BY操作。
MySQL 不能確定在兩個值之間大約有多少行。如果將一個 MyISAM 表改為 HASH索引的MEMORY表,會影響一些查詢的執行效率。
只能使用整個關鍵字來搜尋一行。
而對於BTREE索引,當使用>、<、>=、<=、BETWEEN、!=或者<>,或者LIKE 'pattern' (其中'pattern'不以萬用字元開始)操作符時,都可以使用相關列上的索引。
更多內容:深入淺出MySQL-10章