首先 索引長度和區分度是相互矛盾的,
索引長度太短,那麼區分度就很低,吧索引長度加長,區分度就高,但是索引也是要佔記憶體的,所以我們需要找到乙個平衡點;
那麼這個平衡點怎麼來定?
比如使用者表有個字段 username ,要給他加索引,問題是索引長度多少合適?
其實我們知道 百家姓裡面有百多個姓 ,但是大多數人的姓 集中在前十多個;如果我設定索引索引長度為1,對染佔記憶體少,但是區分度低,
區分度低索引的效率越低。太長則佔記憶體;
首先你要知道 mysql的索引都是排好序的。如果區分度高排序越快,區分度越低,排序慢;
舉個例子: (張,張三,張三哥),如果索引長度取1的話,那麼每一行的索引都是 張 這個字,完全沒有區分度,你讓他怎麼排序?結果這樣三行完全是隨機排的,因為索引都一樣;
如果長度取2,那麼排序的時候至少前兩個是排對了的,如果取3,區分度達到100%,排序完全正確;
等等,那你說是不是索引越長越好? 答案肯定是錯的,比如 (張,李,王) 和 (張三啦啦啦,張三呵呵呵,張三呼呼呼);前者在記憶體中排序占得空間少,排序也快,後者明顯更慢更佔記憶體,在大資料應用中這一點點都是很恐怖的;
所以要做乙個取捨;這個取捨不是沒有乙個固定的量;需要跟你自己的資料庫裡面的資料來判斷;比較常規的公式是:
test是要加索引的字段,5是索引長度,
select求出乙個浮點數,這個浮點數是逐漸趨向1的,網上找了個來分析下;count(distinct
left(test,5))/
count(*) from
table;
這個地方觀察到,當索引長度達到4的時候就已經趨向1了,所以長度設為4是最佳的,在大點增加的索引效果已經很小了,這個地方不是說必須接近1才行;
其實這個值達到0.1就已經可以接受了;總之要找乙個平衡點;
還有一些特殊的字段常規方法用起不太順暢,比如有乙個url欄位,絕大部分的url都是 http://www. 開頭的
這種情況下索引長度取取到11都是無效的,需要更長的索引,那麼有沒有優雅的方式來解決呢;
第一種方法: 可以將資料倒序存入資料庫;
第二種方法:對字串進行crc32雜湊處理;
兩種方法都不錯,當然要配合客戶端程式完成;
mysql獲取指定字串長度函式
1、left(s,n)函式返回字串s開始的最左邊n個字元。
e.g: select left(『abcde12345『,5); *****=>『abcde『
2、right(s,n)函式返回字串s最右邊的n個字元。
e.g: select right(『abcde12345『,5); *****=>『12345『
3、結合concat函式使用。
e.g: select concat(left(『abcde12345『,5),『00『); *****=>『abcde00『
MySQL 索引長度和區分度
首先 索引長度和區分度是相互矛盾的,索引長度太短,那麼區分度就很低,吧索引長度加長,區分度就高,但是索引也是要佔記憶體的,所以我們需要找到乙個平衡點 那麼這個平衡點怎麼來定?比如使用者表有個字段 username 要給他加索引,問題是索引長度多少合適?其實我們知道 百家姓裡面有百多個姓 但是大多數人...
mysql 索引長度與區分度的選擇
理想的索引 索引長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度 占用記憶體多 針對列中的值,從左往右擷取部分,來建索引 1 截的越短,重複度越高,區分度越小,索引效果越不好 2 截的越長,重複度越低,區分度越高,索引效果越好,但帶來的影響也越大 增刪改變慢,併間影響查詢速度.所以,...
mysql索引原則 區分度 MySQL索引設計原則
1.最左字首原則 一般在where條件中兩個及以上欄位時,我們會建聯合索引。若查詢語句 select name,address,country from people where name and country 索引建立有下面兩種方案 a name,country b country,name 將...