mysql建立高效的索引實(shí)例分析
本文實(shí)例講述了mysql建立高效的索引。分享給大家供大家參考,具體如下:
如何建立理想的索引?
- 查詢頻繁度
- 區(qū)分度
- 索引長度
- 覆蓋字段
區(qū)分度
假設(shè)100萬用戶,性別基本上男/女各為50W, 區(qū)分度就低。
長度小
索引長度直接影響索引文件的大小,影響增刪改的速度,并間接影響查詢速度(占用內(nèi)存多).
區(qū)分度高,長度小
問題:如果讓區(qū)分度高,而長度小?
答:可以針對列中的值,從左往右截取部分,來建索引
(1)截的越短, 重復(fù)度越高,區(qū)分度越小, 索引效果越不好
(2)截的越長, 重復(fù)度越低,區(qū)分度越高, 索引效果越好,但帶來的影響也越大–增刪改變慢,并間影響查詢速度.
所以, 我們要在 區(qū)分度 + 長度 兩者上,取得一個(gè)平衡。慣用手法:截取不同長度,并測試其區(qū)分度。
假設(shè)我們有一張表:英語4級的單詞表,里面有13324條記錄,我們怎么給name字段加索引呢?
如果計(jì)算區(qū)分度?
截取單詞第1位的不重復(fù)數(shù):
select count(distinct left(name,1)) from dict
總的數(shù)量:
select count(*) from dict
區(qū)分度:不重復(fù)數(shù)/總的數(shù)量,sql語句如下:
select (select count(distinct left(name,1)) from dict) / (select count(*) from dict) as rate;
然后按照這樣的步驟把其他長度所對應(yīng)的區(qū)分度給找出來,看一個(gè)這個(gè)圖表,可以知道當(dāng)長度為11的時(shí)候重復(fù)度僅僅為1%,我們可以考慮建立11位長的索引
alter table dict add index name name(11);
左前綴不好區(qū)分的情況
對于左前綴不易區(qū)分的列 ,建立索引的技巧
如url列
http://www.baidu.com
http://www.web-bc.cn
列的前11個(gè)字符都是一樣的,不易區(qū)分, 可以用如下2個(gè)辦法來解決
(1)把列內(nèi)容倒過來存儲(chǔ),并建立索引
moc.udiab.www//:ptth
nc.cb-bew.www//://ptth
這樣左前綴區(qū)分度大
(2)偽hash索引效果
同時(shí)存url和url_hash列
#建表 create table t10 ( id int primary key, url char(60) not null default '' ); #插入數(shù)據(jù) 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'); #修改表結(jié)構(gòu),添加urlcrc列 alter table t10 add urlcrc int unsigned not null;
在存儲(chǔ)的時(shí)候,將url對應(yīng)的crc32碼一同插入到數(shù)據(jù)庫中,然后按照urlcrc字段建立索引,然后查找的時(shí)候,我們在業(yè)務(wù)層中將對應(yīng)的url轉(zhuǎn)換為crc32進(jìn)行查找,就可以利用上索引了。
因?yàn)閏rc的結(jié)果是32位int無符號數(shù),因此當(dāng)數(shù)據(jù)超過40億,也會(huì)有重復(fù),但這是值得的.(索引長度為int4個(gè)字節(jié))
多列索引
多列索引的考慮因素—列的查詢頻率 , 列的區(qū)分度, 注意一定要結(jié)合實(shí)際業(yè)務(wù)場景
以ecshop商城為例, goods表中的cat_id,brand_id,做多列索引,從區(qū)分度看,brand_id區(qū)分度更高, 但從 商城的實(shí)際業(yè)務(wù)業(yè)務(wù)看, 顧客一般先選大分類->小分類->品牌,最終選擇建立2個(gè)索引:
(1)index(cat_id,brand_id)
(2)index(cat_id,shop_price)
甚至可以再加 (3)index(cat_id,brand_id,shop_price),3個(gè)冗余索引
但(3)中的前2列和(1)中的前2列一樣,所以可以再去掉(1),建立2個(gè)索引
index(cat_id,price)
和 index(cat_id,brand_id,shop_price);
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計(jì)有所幫助。
相關(guān)文章
MySQL需要根據(jù)特定順序排序的實(shí)現(xiàn)方法
在MySQL中,我們可以通過指定順序排序來在查詢結(jié)果中控制數(shù)據(jù)的排列順序,這種排序方式是非常有用的,本文就來介紹一下,感興趣的可以了解一下2023-11-11mysql如何修改表結(jié)構(gòu)(alter table),多列/多字段
這篇文章主要介紹了mysql如何修改表結(jié)構(gòu)(alter table),多列/多字段問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12mysql數(shù)據(jù)庫如何實(shí)現(xiàn)億級數(shù)據(jù)快速清理
這篇文章主要介紹了mysql數(shù)據(jù)庫實(shí)現(xiàn)億級數(shù)據(jù)快速清理的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04MySQL開發(fā)規(guī)范與使用技巧總結(jié)
今天小編就為大家分享一篇關(guān)于MySQL開發(fā)規(guī)范與使用技巧總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程
這篇文章主要介紹了在MySQL中使用子查詢和標(biāo)量子查詢的基本操作教程,子查詢的使用時(shí)MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-12-12非常實(shí)用的MySQL函數(shù)全面總結(jié)詳解示例分析教程
這篇文章主要為大家介紹了非常實(shí)用的MySQL函數(shù)的詳解示例分析,文中全面的概括了MySQL函數(shù),并進(jìn)行了詳細(xì)的示例講解,有需要的朋友可以借鑒參考下2021-10-10mysql查詢時(shí)offset過大影響性能的原因和優(yōu)化詳解
這篇文章主要給大家介紹了關(guān)于mysql查詢時(shí)offset過大影響性能的原因和優(yōu)化的相關(guān)資料,并在文末跟大家分享了MYSQL中l(wèi)imit,offset的區(qū)別,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06