索引就像是書的目錄,是與表或視圖關聯的磁盤上結構,可以加快從表或視圖中檢索行的速度。索引中包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構(BTree)中,使SQL可以快速有效地查找與鍵值關聯的行。
2. 為什么要建立索引,即索引的優點:
① 建立索引的列可以保證行的唯一性,生成唯一的rowId
② 建立索引可以有效縮短數據的檢索時間
③ 建立索引可以加快表與表之間的連接
④ 為用來排序或者是分組的字段添加索引可以加快分組和排序順序
3. 索引的缺點:
① 創建索引和維護索引需要時間成本,這個成本隨着數據量的增加而加大
② 創建索引和維護索引需要空間成本,每一條索引都要占據數據庫的物理存儲空間,數據量越大,占用空間也越大(數據表占據的是數據庫的數據空間)
③ 會降低表的增刪改的效率,因為每次增刪改索引需要進行動態維護,導致時間變長
4. 什么樣的表跟列要建立索引:
① 總的來說就是數據量大的,經常進行查詢操作的表要建立索引
② 表中字段建立索引應該遵循幾個原則:
1) 越小的數據類型通常更好:越小的數據類型通常在磁盤、內存中都需要更少的空間,處理起來更快。
2) 簡單的數據類型更好:整型數據比起字符,處理開銷更小,因為字符串的比較更復雜,處理起來也更耗時。
3) 盡量避免NULL:應該指定列為NOT NULL。含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。
4) 對非唯一的字段,例如“性別”這種大量重復值的字段,增加索引也沒有什么意義,所以索引的建立應當更多的選取唯一性更高的字段。
③ 表與表連接用於多表聯合查詢的約束條件的字段應當建立索引
④ 用於排序的字段可以添加索引,用於分組的字段應當視情況看是否需要添加索引。
⑤ 添加多列索引的時候,對應的多條件查詢可以觸發該索引的同時,索引最左側的列的單條件查詢也可以觸發。
⑥ 如果有些表注定只會進行查詢所有,也就沒必要添加索引,因為查詢全部只能進行全量搜索即掃描全表。
5. 索引的原理:
索引的原理大致概括為以空間換時間,數據庫在未添加索引的時候進行查詢默認的是進行全量搜索,也就是進行全局掃描,有多少條數據就要進行多少次查詢,然后找到相匹配的數據就把他放到結果集中,直到全表掃描完。而建立索引之后,會將建立索引的KEY值放在一個n叉樹上(BTree)。因為B樹的特點就是適合在磁盤等直接存儲設備上組織動態查找表,每次以索引進行條件查詢時,會去樹上根據key值直接進行搜索,次數約為log總條數,底數為頁面存儲數,例如一個100萬數據的表,頁面存儲數為100,那么有索引的查詢次數為3次log1000000100,但是全量搜索為100萬次搜索,這種方式類似於二分法,但是這個是n分法。
索引對增刪改的影響實際數據修改測試:
一個表有字段A、B、C,同時進行插入10000行記錄測試
在沒有建索引時平均完成時間是2.9秒
在對A字段建索引后平均完成時間是6.7秒
在對A字段和B字段建索引后平均完成時間是10.3秒
在對A字段、B字段和C字段都建索引后平均完成時間是11.7秒
從以上測試結果可以明顯看出索引對數據修改產生的影響
轉自:https://blog.csdn.net/miracleww/article/details/53352738.