加索引不一定提升查詢性能,關鍵在于合理創建與使用。1.適合創建索引的情況包括:經常出現在where條件中的列、用于join連接的列、需要排序或分組的列、唯一值較多的列(如email),而唯一性差的字段(如性別)不適合;2.正確創建索引需注意:選擇合適的索引類型(如b+樹適用于范圍查找,默認使用即可)、組合索引順序影響查詢效果(如name和age組成的索引不能單獨用于age查詢)、控制字符串索引長度以提升效率(如對email字段前10位建索引);3.查詢時應避免在where中對字段運算或使用函數(如year(create_time)失效)、like以%開頭會失效但結尾可用索引、盡量避免select *以利用覆蓋索引;4.維護索引應注意:定期清理冗余索引、刪除無用索引、謹慎為頻繁更新字段加索引,并通過explain分析執行計劃確認是否命中索引。
索引是mysql中提升查詢性能最有效的手段之一,但不是只要加了索引就一定快。真正發揮索引作用的關鍵,在于怎么創建、如何使用,以及是否合理匹配查詢語句。
什么時候該創建索引?
索引不是越多越好,也不是所有字段都適合加索引。通常來說,以下幾種情況適合創建索引:
- 經常出現在WHERE條件中的列
- 用于JOIN連接的列
- 需要排序(ORDER BY)或分組(GROUP BY)的列
- 查詢結果中唯一值較多的列(高選擇性)
比如一個用戶表的email字段,每個用戶基本都是唯一的,這種字段加索引效果很好;而像“性別”這種只有男/女兩個值的字段,加索引幾乎沒用。
如何正確創建索引?
創建索引時要注意幾個關鍵點,否則可能達不到預期效果。
使用合適的索引類型
MySQL常用的索引類型有:
- B+樹索引(默認):適用于范圍查找、排序等場景
- 哈希索引:僅支持等值比較,不支持范圍查詢
- 全文索引:用于文本內容的模糊匹配
一般情況下,默認使用B+樹即可滿足大多數需求。
注意組合索引的順序
組合索引是指在多個字段上建立一個聯合索引,比如:
CREATE INDEX idx_name_age ON users(name, age);
這個索引可以用于查詢name,或者同時查詢name和age,但不能單獨用于查詢age。因為索引是按字段順序構建的,所以組合索引的字段順序非常重要。
控制索引長度(尤其是字符串)
對于較長的字符串字段(如VARCHAR(255)),可以指定前綴長度來創建索引:
CREATE INDEX idx_email_prefix ON users(email(10));
這樣可以減少索引大小,提高寫入效率,但前提是前10個字符已經具備足夠區分度。
查詢時如何利用好索引?
即使有了索引,如果SQL寫法不當,也可能導致索引失效。
避免在WHERE條件中對字段做運算或函數操作
例如:
select * FROM users WHERE YEAR(create_time) = 2023;
這會導致create_time上的索引無法使用。正確的做法是改寫為:
SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';
不要在LIKE中以通配符開頭
下面這條語句不會走索引:
SELECT * FROM users WHERE name LIKE '%Tom';
但如果寫成:
SELECT * FROM users WHERE name LIKE 'Tom%';
就可以命中索引。
盡量避免SELECT *
如果你只需要幾個字段,不要用SELECT *,而是明確列出需要的字段。這樣可以利用覆蓋索引,直接從索引中取數據,不需要回表查詢。
索引維護與注意事項
索引雖然能加快查詢速度,但也會影響寫入性能(插入、更新、刪除)。因此要注意以下幾點:
- 定期檢查冗余索引,避免重復創建
- 刪除不再使用的索引,減少維護成本
- 對頻繁更新的字段謹慎加索引
- 可以使用EXPLAIN分析SQL執行計劃,確認是否命中索引
比如運行:
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
查看輸出中的key列是否有值,type是否為ref或range,判斷是否有效使用了索引。
基本上就這些。索引優化看起來簡單,其實有很多細節容易被忽略,特別是在實際業務查詢中,不同SQL寫法帶來的影響差異很大。多用EXPLAIN、多觀察慢查詢日志,才是持續優化的關鍵。