mysql某千萬級數據表中某欄位有100多種取值,該欄位適合加索引嗎?

mysql某表中大約1000萬左右數據,其中某欄位只有100多種取值,某些語句查詢條件需要用到此欄位,此欄位適合加索引嗎?


謝 @海洋 邀, 這個問題,我就只按字面的意思+一些假設來回答

也就是 select * from table_name where state=XX, table_name表有1KW條記錄,這個表有不少於三個欄位,state有100+種取值並且這些取值所佔的比例相當。

那加索引合適。


目測可以加。查詢數據的效率主要是集中在IO的成本上。加不加索引的主要切入點是:索引之後,回表查數據的量+索引的大小是否小於全表取出的數據量,越小越好。你的這種情況,該欄位100種值,如果分布還算均勻的話,查一種值回表平均要查10萬條數據,那麼10萬條數據的大小+索引的大小,應該還是比較小於1000萬數據的。理論歸理論,理論只能告訴你為什麼可以這樣做,但能不能這樣做要根據自己的情況。最簡單最實際的辦法就是去測試,效果一下便明了。解決方案如果不局限樓主的提問的話,最好的解決辦法是用該欄位進行分區或者分表。或再加上索引。


不建議做二級索引,但欄位如果不太長的話,也許可以做主鍵前綴


幾個月前,我看到過一個知乎網友關於index的回答,深以為然。

在知乎上問該不該加索引的任何問題,直接回答:該加。就足夠了。


http://www.cnblogs.com/y-rong/p/5908236.html

不同意樓上答案中的部分觀點,複合索引(聯合索引,多列索引,隨你怎麼叫)就好了(你只加一個索引肯定要回行這麼多啊,複合索引就好些了,一個欄位過濾百分之一,兩個欄位就過濾掉萬分之一了)。

效果好不好的話,還是依前人答案中建議試一試,分析一下時間就好了。


不如加個索引測試一下呢?如果能做到索引覆蓋的話應該有較大幫助。


加索引肯定會有幫助,但是10萬的碰撞,嗯,幫助不是特別大

你應該換一種搜索演算法,盡量換一種演算法來搜索


邀請我回答嗎?我可以把你帶到溝里:)

要綜合實際情況考慮,如果這張表沒有其他的頻繁的SQL,就可以加。

如果表有其他頻繁的SQL就慎重考慮,因為每增加一個索引對其他的查詢都會有影響。


瀉藥。加!只不過要選擇合適的索引。看該欄位是數值型還是字元串類型,是否有規律(前綴相同還是完全隨機)。加完以後測一下,別直接線上加。如果要線上加,選擇閑時。5.5構建索引時,阻塞讀寫操作,我當時用的pt-online-schema-change 可以使用。


謝邀~似懂非懂,還是不要把大家方向帶錯了


你還不如根據這個欄位做hash分區的,不過數據量太小,分區看不出效果,如果你的數據增量能保證這個表三個月內數據量上億的話,倒是可以做


邀請我…有什麼用嗎(。

百度了一下專業名詞,很頭大。

據說加索引會降低更新表的速度,但是既然能極高提高搜索效率,而且是需要用到的欄位,哪怕取值少,相比加和不加,哪個損失更大?

…我真的沒學過啊。


欄位值如果跟主鍵是離散分布的話,應該不合適吧。因為索引再回表是一個隨機磁碟操作,而全表掃描是個順序磁碟操作,順序讀盤效率更高。


一百多種值,可以拆多一張字典表了,拆了查詢效率更高


你不會加了索引然後查看一下各個功能的sql語句的執行計劃嗎?

不會?那你還是加吧.


就算加了索引,默認也不會用。


適合,而且肯定需要,目測你肯定會用到這個欄位做區分去查詢。不過這個區分度你可以考慮以這個為開始,做複合索引


看看欄位是否過長,如果過長的話可以做主鍵前綴


如樓上回答的一樣,不建議,碰撞太高,換成資料庫內部的術語就是選擇率不高,回表10萬次的代價也是很大的,一般也是很難選到這個索引的。建議你考慮下是否表設計不夠合理,這種情況一般可以拆解成字典表和數據表了,還可以更省存儲空間。


推薦閱讀:

臺灣出版的、附有索引的書籍,其中文索引常用何種排序方式?
作為一名貼圖黨,你是如何在上G的圖庫中快速找到合適的圖的?

TAG:MySQL | 資料庫管理員DBA | 索引 | MySQLDBA |