搜索的索引列,不必定是所要選擇的列。換句話說,最適合索引的列是出如今WHERE 子句中的列,或鏈接子句中指定的列,而不是出如今SELECT 關鍵字後的選擇列表中的列。緩存
使用唯一索引。考慮某列中值的分佈。對於唯一值的列,索引的效果最好,而具備多個重複值的列,其索引效果最差。例如,存放年齡的列具備不一樣值,很容易區分各行。而用來記錄性別的列,只含有「 M」和「F」,則對此列進行索引沒有多大用處(無論搜索哪一個值,都會得出大約一半的行)性能
使用短索引。若是對串列進行索引,應該指定一個前綴長度,只要有可能就應該這樣作。例如,若是有一個CHAR(200) 列,若是在前10 個或20 個字符內,多數值是唯一的,那麼就不要對整個列進行索引。對前10 個或20 個字符進行索引可以節省大量索引空間,也可能會使查詢更快。較小的索引涉及的磁盤I/O 較少,較短的值比較起來更快。更爲重要的是,對於較短的鍵值,索引高速緩存中的塊能容納更多的鍵值,所以,MySQL也能夠在內存中容納更多的值。這增長了找到行而不用讀取索引中較多塊的可能性。(固然,應該利用一些常識。如僅用列值的第一個字符進行索引是不可能有多大好處的,由於這個索引中不會有許多不一樣的值。)優化
利用最左前綴。在建立一個n 列的索引時,實際是建立了MySQL 可利用的n 個索引。多列索引可起幾個索引的做用,由於可利用索引中最左邊的列集來匹配行。這樣的列集稱爲最左前綴。(這與索引一個列的前綴不一樣,索引一個列的前綴是利用該的前n 個字符做爲索引值。).net
不要過分索引。不要覺得索引「越多越好」,什麼東西都用索引是錯的。每一個額外的索引都要佔用額外的磁盤空間,並下降寫操做的性能,這一點咱們前面已經介紹過。在修改表的內容時,索引必須進行更新,有時可能須要重構,所以,索引越多,所花的時間越長。若是有一個索引不多利用或從不使用,那麼會沒必要要地減緩表的修改速度。此外,MySQL 在生成一個執行計劃時,要考慮各個索引,這也要費時間。建立多餘的索引給查詢優化帶來了更多的工做。索引太多,也可能會使MySQL 選擇不到所要使用的最好索引。只保持所需的索引有利於查詢優化。若是想給已索引的表增長索引,應該考慮所要增長的索引是不是現有多列索引的最左索引。若是是,則就不要費力去增長這個索引了,由於已經有了。blog
本文出自tracywxh的專欄(http://blog.csdn.net/tracywxh/article/details/39896963 ),轉載請註明出處!索引