索引的原理大致概括為以空間換時間,資料庫在未新增索引的時候進行查詢預設的是進行全量搜尋,也就是進行全域性掃瞄,有多少條資料就要進行多少次查詢,然後找到相匹配的資料就把他放到結果集中,直到全表掃瞄完。而建立索引之後,會將建立索引的key值放在乙個n叉樹上(btree)。因為b樹的特點就是適合在磁碟等直接儲存裝置上組織動態查詢表,每次以索引進行條件查詢時,會去樹上根據key值直接進行搜尋,次數約為log總條數,底數為頁面儲存數,例如乙個100萬資料的表,頁面儲存數為100,那麼有索引的查詢次數為3次log1000000100,但是全量搜尋為100萬次搜尋,這種方式類似於二分法,但是這個是n分法。
1.選擇唯一性索引
唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的字段。為該字段建立唯一性索引可以很快的確定某個學生的資訊。如果使用姓名的話,可能存在同名現象,從而降低查詢速度。
2.為經常需要排序、分組和聯合操作的字段建立索引
經常需要order by、group by、distinct和union等操作的字段,排序操作會浪費很多時間。如果為其建立索引,可以有效地避免排序操作。
3.為常作為查詢條件的字段建立索引
如果某個字段經常用來做查詢條件,那麼該字段的查詢速度會影響整個表的查詢速度。因此,為這樣的字段建立索引,可以提高整個表的查詢速度。
4.限制索引的數目
索引的數目不是越多越好。每個索引都需要占用磁碟空間,索引越多,需要的磁碟空間就越大。修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。
5.盡量使用資料量少的索引
如果索引的值很長,那麼查詢的速度會受到影響。例如,對乙個char(100)型別的字段進行全文檢索需要的時間肯定要比對char(10)型別的字段需要的時間要多。
6.盡量使用字首來索引
如果索引欄位的值很長,最好使用值的字首來索引。例如,text和blog型別的字段,進行全文檢索會很浪費時間。如果只檢索欄位的前面的若干個字元,這樣可以提高檢索速度。
7.刪除不再使用或者很少使用的索引
表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再需要。資料庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。
8 . 最左字首匹配原則,非常重要的原則。
mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a 1=」」 and=」」 b=」2」 c=」「> 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
9 .=和in可以亂序。
比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式
10 . 盡量選擇區分度高的列作為索引。
區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度就 是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃瞄10條 記錄
11 .索引列不能參與計算,保持列「乾淨」。
比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的字段值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本 太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』);
12 .盡量的擴充套件索引,不要新建索引。
比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可
注意:選擇索引的最終目的是為了使查詢的速度變快。上面給出的原則是最基本的準則,但不能拘泥於上面的準則。讀者要在以後的學習和工作中進行不斷的實踐。根據應用的實際情況進行分析和判斷,選擇最合適的索引方式。
① 建立索引的列可以保證行的唯一性,生成唯一的rowid
② 建立索引可以有效縮短資料的檢索時間
③ 建立索引可以加快表與表之間的連線
④ 為用來排序或者是分組的字段新增索引可以加快分組和排序順序
① 建立索引和維護索引需要時間成本,這個成本隨著資料量的增加而加大
② 建立索引和維護索引需要空間成本,每一條索引都要佔據資料庫的物理儲存空間,資料量越大,占用空間也越大(資料表佔據的是資料庫的資料空間)
③ 會降低表的增刪改的效率,因為每次增刪改索引需要進行動態維護,導致時間變長
1.最左字首匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。
資料庫建立索引的優缺點
為什麼要建立索引呢?這是因為,建立索引可以大大提高系統的效能,優點 第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。第四,在使用分組和排序子句進...
資料庫建立索引的優缺點
為什麼要建立索引呢?這是因為,建立索引可以大大提高系統的效能,優點 第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。第四,在使用分組和排序子句進...
資料庫索引優缺點
建立索引的優點 建立索引可以大大提高系統效能!具體如下 1.通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。2.可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。3.可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。4.在使用分組和排序子句進行資料檢索時,同樣可...