索引優(yōu)化
索引區(qū)分度
前言
索引長(zhǎng)度直接影響索引文件的大小,影響增刪改的速度,并間接影響查詢速度(占用內(nèi)存多)
針對(duì)列的值,從左往右截取部分來(lái)建立索引(前綴索引
)
- 截的越短,重復(fù)度越高,區(qū)分度越小,索引效果越差。
- 截的越長(zhǎng),重復(fù)度越低,區(qū)分度越大,索引效果越好。但是需要更多的空間存儲(chǔ)索引文件。增刪改變慢。
所以我們需要在區(qū)分度 / 長(zhǎng)度兩者間取得一個(gè)平衡。我們可以截取不同的長(zhǎng)度,并測(cè)試其區(qū)分度。
公式
單列區(qū)分度計(jì)算:select count(distinct (列名))/ count(*) from table;
獲取單列最大區(qū)分度
索引區(qū)分度計(jì)算:select count(distinct left(列名,截取長(zhǎng)度))/ count(*) from table;
計(jì)算指定索引長(zhǎng)度區(qū)分度
區(qū)分度值位于 0.0000~1.0000 之間,該值越大即該字段的區(qū)分度越大!
char,varchar類型,length 可以小于字段實(shí)際長(zhǎng)度;如果是 blog和 text類型,必須指定 length.
演示
區(qū)分度計(jì)算
占用差
索引建立
優(yōu)先采用區(qū)分度高的列建立索引,索引列截取長(zhǎng)度可適當(dāng)延長(zhǎng)一定范圍
常見計(jì)算規(guī)則
- 不同的字符集(表的字符集),一個(gè)字符占用的字節(jié)數(shù)不同。
- latin1: 1character = 1byte
- gbk: 1character = 2byte
- utf8: 1character = 3byte
- utf8mb4: 1character = 4byte
- 所有的索引字段,如果沒有設(shè)置not null,則需要加一個(gè)字節(jié)。
- 定長(zhǎng)字段,int占四個(gè)字節(jié)、date占三個(gè)字節(jié)、char(n)占n個(gè)字符。
- 對(duì)于可變字段varchar(n),則有n個(gè)字符+兩個(gè)字節(jié)。
char(n) = (Character Set:utf8mb4=4/utf8=3/gbk=2/latin1=1) * n(列長(zhǎng)度) + 1(允許null)
varchar(n) = (Character Set:utf8mb4=4/utf8=3/gbk=2/latin1=1) * n(列長(zhǎng)度) + 2(固定值) + 1(允許null)
未完待續(xù)
SQL優(yōu)化
- 待寫作