創建索引,六個小細節必須了解
本文轉載自微信公眾號「碼上Java」,作者碼上Java。轉載本文請聯系碼上Java公眾號。
1. 字段的數值有唯一性的限制,比如用戶名
索引本身可以起到約束的作用,比如唯一索引、主鍵索引都是可以起到唯一性約束的,因此在我們的數據表中,如果某個字段是唯一性的,就可以直接創建唯一性索引,或者主鍵索引。
2. 頻繁作為 WHERE 查詢條件的字段,尤其在數據表大的情況下
在數據量大的情況下,某個字段在 SQL 查詢的 WHERE 條件中經常被使用到,那么就需要給這個字段創建索引了。創建普通索引就可以大幅提升數據查詢的效率。
3. 需要經常 GROUP BY 和 ORDER BY 的列
索引就是讓數據按照某種順序進行存儲或檢索,因此當我們使用 GROUP BY 對數據進行分組查詢,或者使用 ORDER BY 對數據進行排序的時候,就需要對分組或者排序的字段進行索引。
4.UPDATE、DELETE 的 WHERE 條件列,一般也需要創建索引
我們剛才說的是數據檢索的情況。那么當我們對某條數據進行 UPDATE 或者 DELETE 操作的時候,是否也需要對 WHERE 的條件列創建索引呢?
對數據按照某個條件進行查詢后再進行 UPDATE 或 DELETE 的操作,如果對 WHERE 字段創建了索引,就能大幅提升效率。原理是因為我們需要先根據 WHERE 條件列檢索出來這條記錄,然后再對它進行更新或刪除。如果進行更新的時候,更新的字段是非索引字段,提升的效率會更明顯,這是因為非索引字段更新不需要對索引進行維護。
不過在實際工作中,我們也需要注意平衡,如果索引太多了,在更新數據的時候,如果涉及到索引更新,就會造成負擔。
5.DISTINCT 字段需要創建索引
有時候我們需要對某個字段進行去重,使用 DISTINCT,那么對這個字段創建索引,也會提升查詢效率。
6. 做多表 JOIN 連接操作時,創建索引需要注意以下的原則
首先,連接表的數量盡量不要超過 3 張,因為每增加一張表就相當于增加了一次嵌套的循環,數量級增長會非常快,嚴重影響查詢的效率。
其次,對 WHERE 條件創建索引,因為 WHERE 才是對數據條件的過濾。如果在數據量非常大的情況下,沒有 WHERE 條件過濾是非常可怕的。
總結
最后,對用于連接的字段創建索引,并且該字段在多張表中的類型必須一致。比如 user_id 在 product_comment 表和 user 表中都為 int(11) 類型,而不能一個為 int 另一個為 varchar 類型。