您好,登錄后才能下訂單哦!
本文實例講述了mysql建立高效的索引。分享給大家供大家參考,具體如下:
如何建立理想的索引?
區分度
假設100萬用戶,性別基本上男/女各為50W, 區分度就低。
長度小
索引長度直接影響索引文件的大小,影響增刪改的速度,并間接影響查詢速度(占用內存多).
區分度高,長度小
問題:如果讓區分度高,而長度小?
答:可以針對列中的值,從左往右截取部分,來建索引
(1)截的越短, 重復度越高,區分度越小, 索引效果越不好
(2)截的越長, 重復度越低,區分度越高, 索引效果越好,但帶來的影響也越大–增刪改變慢,并間影響查詢速度.
所以, 我們要在 區分度 + 長度 兩者上,取得一個平衡。慣用手法:截取不同長度,并測試其區分度。
假設我們有一張表:英語4級的單詞表,里面有13324條記錄,我們怎么給name字段加索引呢?
如果計算區分度?
截取單詞第1位的不重復數:
select count(distinct left(name,1)) from dict
總的數量:
select count(*) from dict
區分度:不重復數/總的數量,sql語句如下:
select (select count(distinct left(name,1)) from dict) / (select count(*) from dict) as rate;
然后按照這樣的步驟把其他長度所對應的區分度給找出來,看一個這個圖表,可以知道當長度為11的時候重復度僅僅為1%,我們可以考慮建立11位長的索引
alter table dict add index name name(11);
左前綴不好區分的情況
對于左前綴不易區分的列 ,建立索引的技巧
如url列
http://www.baidu.com
http://www.web-bc.cn
列的前11個字符都是一樣的,不易區分, 可以用如下2個辦法來解決
(1)把列內容倒過來存儲,并建立索引
moc.udiab.www//:ptth
nc.cb-bew.www//://ptth
這樣左前綴區分度大
(2)偽hash索引效果
同時存url和url_hash列
#建表 create table t10 ( id int primary key, url char(60) not null default '' ); #插入數據 insert into t10 values (1,'http://www.baidu.com'), (2,'http://www.sina.com'), (3,'http://www.sohu.com.cn'), (4,'http://www.onlinedown.net'), (5,'http://www.gov.cn'); #修改表結構,添加urlcrc列 alter table t10 add urlcrc int unsigned not null;
在存儲的時候,將url對應的crc32碼一同插入到數據庫中,然后按照urlcrc字段建立索引,然后查找的時候,我們在業務層中將對應的url轉換為crc32進行查找,就可以利用上索引了。
因為crc的結果是32位int無符號數,因此當數據超過40億,也會有重復,但這是值得的.(索引長度為int4個字節)
多列索引
多列索引的考慮因素—列的查詢頻率 , 列的區分度, 注意一定要結合實際業務場景
以ecshop商城為例, goods表中的cat_id,brand_id,做多列索引,從區分度看,brand_id區分度更高, 但從 商城的實際業務業務看, 顧客一般先選大分類->小分類->品牌,最終選擇建立2個索引:
(1)index(cat_id,brand_id)
(2)index(cat_id,shop_price)
甚至可以再加 (3)index(cat_id,brand_id,shop_price),3個冗余索引
但(3)中的前2列和(1)中的前2列一樣,所以可以再去掉(1),建立2個索引
index(cat_id,price)
和 index(cat_id,brand_id,shop_price);
更多關于MySQL相關內容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL常用函數大匯總》、《MySQL日志操作技巧大全》、《MySQL事務操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數據庫鎖相關技巧匯總》
希望本文所述對大家MySQL數據庫計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。