1. 數據庫索引:
索引就像是書的目錄,是與表或視圖關聯的磁盤上結構,能夠加快從表或視圖中檢索行的速度。索引中包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構(BTree)中,使SQL能夠快速有效地查找與鍵值關聯的行。數據庫
2. 爲何要創建索引,即索引的優勢:
① 創建索引的列能夠保證行的惟一性,生成惟一的rowId測試
② 創建索引能夠有效縮短數據的檢索時間優化
③ 創建索引能夠加快表與表之間的鏈接spa
④ 爲用來排序或者是分組的字段添加索引能夠加快分組和排序順序排序
3. 索引的缺點:
① 建立索引和維護索引須要時間成本,這個成本隨着數據量的增長而加大索引
② 建立索引和維護索引須要空間成本,每一條索引都要佔據數據庫的物理存儲空間,數據量越大,佔用空間也越大(數據表佔據的是數據庫的數據空間)內存
③ 會下降表的增刪改的效率,由於每次增刪改索引須要進行動態維護,致使時間變長字符串
4. 什麼樣的表跟列要創建索引:
① 總的來講就是數據量大的,常常進行查詢操做的表要創建索引class
② 表中字段創建索引應該遵循幾個原則:效率
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秒
從以上測試結果能夠明顯看出索引對數據修改產生的影響