一、什麼是索引
索引就好比我們書的目錄,是與表或視圖關聯的磁盤上結構,可以加快從表或視圖中檢索行的速度。索引中包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構(BTree)中,使SQL可以快速有效地查找與鍵值關聯的行。
二、索引的優缺點
1、 優點
- 建立索引的列可以保證行的唯一性,生成唯一的rowId
- 建立索引可以有效縮短數據的檢索時間
- 建立索引可以加快表與表之間的連接
- 爲用來排序或者是分組的字段添加索引可以加快分組和排序順序
2、缺點
- 創建索引和維護索引需要時間成本,這個成本隨着數據量的增加而加大
- 創建索引和維護索引需要空間成本,每一條索引都要佔據數據庫的物理存儲空間,數據量越大,佔用空間也越大(數據表佔據的是數據庫的數據空間)
- 會降低表的增刪改的效率,因爲每次增刪改索引需要進行動態維護,導致時間變長
三、索引建立的原則
1、總的來說就是數據量大的,經常進行查詢操作的表要建立索引
2、表中字段建立索引應該遵循幾個原則
1)越小的數據類型通常更好:越小的數據類型通常在磁盤、內存中都需要更少的空間,處理起來更快。
2) 簡單的數據類型更好:整型數據比起字符,處理開銷更小,因爲字符串的比較更復雜,處理起來也更耗時。
3) 儘量避免NULL:應該指定列爲NOT NULL。含有空值的列很難進行查詢優化,因爲它們使得索引、索引的統計信息以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值。
4) 對非唯一的字段,例如“性別”這種大量重複值的字段,增加索引也沒有什麼意義,所以索引的建立應當更多的選取唯一性更高的字段。
四、mysql索引種類
1、主鍵索引(PRIMARY KEY)
唯一,不允許爲空,建立的規則是 int優於varchar,一般在建表的時候創建立,一般會設爲 int 而且是 AUTO_INCREMENT自增類型。
2、唯一索引(UNIQUE INDEX)
索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。創建示例:
CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(`account`);
3、普通索引(ORDINARY INDEX)
這是最基本的索引,它沒有任何限制。創建示例:
CREATE INDEX account_Index ON `award`(`account`);
或 ALTER TABLE award ADD INDEX account_Index(`account`)
4、全文索引(FULLTEXT INDEX)
在mysql中fulltext 索引只針對 myisam生效,所以全文不常用到
5、組合索引(UNION INDEX)
多個普通索引組合在一起,在使用查詢的時候遵循mysql組合索引的"最左前綴",
CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...)
如果你建立了 組合索引(nickname_account_createdTime_Index) 那麼他實際包含的是3個索引 (nickname) (nickname,account)(nickname,account,created_time)
五、mysql索引失效情況
1、like右模糊匹配索引生效,左模糊不生效,如 name like '李%' 索引有效,name like '%李%' 索引無效
2、多列組合索引範圍查詢的列之後的列的索引不生效
3、 判斷空時候要用is null,用“=null”不走索引
4、group by分組不會使用索引
5、使用or時候,所有條件列都必須加上索引,只要一個不加索引都不生效