mysql 索引長度和區分度

來源:互聯網
上載者:User

標籤:count   欄位   alt   mysql   tab   使用者表   http   log   排序   

首先  索引長度和區分度是相互矛盾的,

索引長度太短,那麼區分度就很低,吧索引長度加長,區分度就高,但是索引也是要佔記憶體的,所以我們需要找到一個平衡點;

那麼這個平衡點怎麼來定?

 

比如使用者表有個欄位 username ,要給他加索引,問題是索引長度多少合適?

其實我們知道 百家姓裡面有百多個姓 ,但是大多數人的姓 集中在前十多個;如果我設定索引索引長度為1,對染占記憶體少,但是區分度低,

區分度低索引的效率越低。太長則占記憶體;

 

首先你要知道 mysql的索引都是排好序的。如果區分度高排序越快,區分度越低,排序慢;

舉個例子:  (張,張三,張三哥),如果索引長度取1的話,那麼每一行的索引都是 張 這個字,完全沒有區分度,你讓他怎麼排序?結果這樣三行完全是隨機排的,因為索引都一樣;

如果長度取2,那麼排序的時候至少前兩個是排對了的,如果取3,區分度達到100%,排序完全正確;

等等,那你說是不是索引越長越好?  答案肯定是錯的,比如 (張,李,王)  和 (張三啦啦啦,張三呵呵呵,張三呼呼呼);前者在記憶體中排序佔得空間少,排序也快,後者明顯更慢更占記憶體,在大資料應用中這一點點都是很恐怖的;

 

所以要做一個取捨;這個取捨不是沒有一個固定的量;需要跟你自己的資料庫裡面的資料來判斷;比較常規的公式是:

test是要加索引的欄位,5是索引長度,

select count(distinct left(test,5))/count(*) from table;   

求出一個浮點數,這個浮點數是逐漸趨向1的,網上找了個圖片來分析下;

這個地方觀察到,當索引長度達到4的時候就已經趨向1了,所以長度設為4是最佳的,在大點增加的索引效果已經很小了,這個地方不是說必須接近1才行;

其實這個值達到0.1就已經可以接受了;總之要找一個平衡點;

 

還有一些特殊的欄位常規方法用起不太順暢,比如有一個url欄位,絕大部分的url都是 http://www. 開頭的

這種情況下索引長度取取到11都是無效的,需要更長的索引,那麼有沒有優雅的方式來解決呢;

第一種方法: 可以將資料倒序存入資料庫;

第二種方法:對字串進行crc32雜湊處理;

兩種方法都不錯,當然要配合用戶端程式完成;

mysql 索引長度和區分度

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.