mysql建立高效的索引例項分析

2022-09-25 05:45:11 字數 1924 閱讀 9500

如何建立理想的索引?

區分度假設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 name name(11);

左字首不好區分的情況

對於左字首不易區分的列 ,建立索引的技巧

如url列

列的前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,''),

(2,''),

(3,''),

(4,''),

(5,'');

#修改表結構,新增urlcrc列

alter table t10 add urlcrc int unsigned not null;

在儲存的odbyrmmv時候,將url對應的crc32碼一同插入到資料庫中,然後按照urlcrc欄位建立索引,然後查詢的時候,我們在業務層中將對應的url轉換為crc32進行查詢,就可以利用上索引了。

因為crc的結果是32位int無符號數,因此當資料超過40億,也會有重複,但這是odbyrmmv值得的.(索引長度為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建立高效索引分析

一 如何建立理想的索引?查詢頻繁度 區分度索引長度 覆蓋字段 1.1區分度 假設100萬使用者,性別基本上男 女各為50w,區分度就低。1.2長度小 索引長度直接影響索引檔案的大小,影響增刪改的速度,並間接影響查詢速度 占用記憶體多 1.3區分度高,長度小 如何讓區分度高,而長度小?可以針對列中的值...

mysql快速高效建立索引

有乙個問題,一張表有3百萬條記錄,隨著時間的增加,記錄量會更多,此時查詢速度很慢。在建立此表前沒有未相應字段新增索引,所以此時需要為表新增索引。但是因為資料量大的原因,索引新增不成功,想了很多辦法,終於在短時間內解決了。辦法如下 1 進入mysql介面。mysql uroot hlocalhost ...

mysql 建立分割槽索引嗎 mysql建立分割槽索引

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 mysql建立分割槽索引 一 分割槽表 把所有的資料放在乙個表中,但是物理儲存資料會根據一定規則存放到不同的檔案中 二 什麼時候使用分割槽表?資料比較大時候,數以億記或者數以tb記的資料,如果使用索引在空間和維護消耗巨大,甚至索引沒有效果了.例子 檢視是...