MySQL優化——索引
內容來自:https://yq.aliyun.com/articles/214494?utm_content=m_31338
對此我們來詳細分析下(也就是大家在面試時需要說的):
場景一,數據表規模不大,就幾千行,即使不建索引,查詢語句的返回時間也不長,這時建索引的意義就不大。當然,若就幾千行,索引所占的空間也不多,所以這種情況下,頂多屬於“性價比”不高。
場景二,某個商品表裏有幾百萬條商品信息,同時每天會在一個時間點,往其中更新大概十萬條左右的商品信息,現在用where語句查詢特定商品時(比如wherename=‘XXX’)速度很慢。為了提升查詢效率可以建索引,但當每天更新數據時,又會重建索引,這是要耗費時間的。這時就需要綜合考慮,甚至可以在更新前刪除索引,更新後再重建。
場景三,從上圖中可以看到,因為在數據表裏ID值都不相同,所以索引能發揮出比較大的作用。相反,如果某個字段重復率很高,如性別字段,或者某個字段大多數值是空(null),那麽不建議對該字段建索引。
請大家記住,一定是有業務需求了才會建索引。比如在一個商品表裏,我們經常要根據name做查詢,如果沒有索引,查詢速度會很慢,這時就需要建索引。但在項目開發中,如果不經常根據商品編號查詢,那麽就沒必要對編號建索引。
最後再強調一次,建索引是要付出代價的,沒事別亂建著玩,同時在一個表上也不能建太多的索引。
下面說下索引建好了該怎麽用?畢竟大家花了不少時間和空間代價建了索引,至少得回本吧?
如果出現一些不好的SQL語句,那麽索引就白建了。下面通過一些具體的例子來看索引的正確用法。
①語句一:selectnamefrom商品表。不會用到索引,因為沒有where語句。
②語句二:select*from商品表wherename=‘Java書’,會用到索引,如果項目裏經常用到name來查詢,且商品表的數據量很大,而name值的重復率又不高,那麽建議建索引。
③語句三:select*from商品表wherenamelike‘Java%’這是個模糊查詢,會用到索引,請大家記住,用like進行模糊查詢時,如果第一個就是模糊的匹配符,比如wherenamelike‘%java’,那麽在查詢時不會走索引。在其他情況下,不論用了多少個%,也不論%的位置,只要不出現在第一個位置,那麽都能用到索引。
學生成績表裏有兩個字段:姓名和成績。現在對成績這個整數類型的字段建索引。
①第一種情況,當數字型字段遇到非等值操作符時,無法用到索引。比如:
selectnamefrom學生成績表where成績>95,一旦出現大於符號,就不能用到索引,為了用到索引,我們應該改一下SQL語句裏的where從句:where成績in(96,97,98,99,100)
②第二種情況,如果對索引字段進行了某種左值操作,那麽無法用到索引。
能用到索引的寫法:selectnamefrom學生成績表where成績=60
不能用到索引的寫法:selectnamefrom學生成績表where成績+40=100
③第三種情況,如果對索引字段進行了函數操作,那麽無法用到索引。
比如SQL語句:select*from商品表wheresubstr(name)=‘J’,我們希望查詢商品名首字母是J的記錄,可一旦針對name使用函數,即使name字段上有索引,也無法用到。
關於索引,當然還有位圖索引和復合索引等,如果大家要應聘更高級的崗位(比如有5年經驗了),那麽就不能止步於此了,但根據我的面試經驗,上述關於索引的說辭對工作經驗3年以下的候選人是有幫助的。
其實我知道,不少程序員平時用過索引,但不知道怎麽說,這很吃虧。對於高級程序員而言,如果你這都說不好,那麽你的能力比初級的要高多少?對於初級程序員而言,如果你掌握了,而且能在面試中很好地說,那麽你和同等能力的人相比,就很占優勢。
MySQL優化——索引