索引優(yōu)化
索引區(qū)分度
前言
索引長度直接影響索引文件的大小兄淫,影響增刪改的速度,并間接影響查詢速度(占用內(nèi)存多)
針對列的值蔓姚,從左往右截取部分來建立索引(前綴索引
)
- 截的越短捕虽,重復(fù)度越高,區(qū)分度越小坡脐,索引效果越差泄私。
- 截的越長,重復(fù)度越低备闲,區(qū)分度越大晌端,索引效果越好。但是需要更多的空間存儲索引文件恬砂。增刪改變慢咧纠。
所以我們需要在區(qū)分度 / 長度兩者間取得一個平衡。我們可以截取不同的長度泻骤,并測試其區(qū)分度漆羔。
公式
單列區(qū)分度計算:select count(distinct (列名))/ count(*) from table;
獲取單列最大區(qū)分度
索引區(qū)分度計算:select count(distinct left(列名,截取長度))/ count(*) from table;
計算指定索引長度區(qū)分度
區(qū)分度值位于 0.0000~1.0000 之間乳幸,該值越大即該字段的區(qū)分度越大!
char钧椰,varchar類型粹断,length 可以小于字段實(shí)際長度;如果是 blog和 text類型嫡霞,必須指定 length.
演示
優(yōu)先采用區(qū)分度高的列建立索引瓶埋,索引列截取長度可適當(dāng)延長一定范圍
常見計算規(guī)則
- 不同的字符集(表的字符集),一個字符占用的字節(jié)數(shù)不同诊沪。
- latin1: 1character = 1byte
- gbk: 1character = 2byte
- utf8: 1character = 3byte
- utf8mb4: 1character = 4byte
- 所有的索引字段养筒,如果沒有設(shè)置not null,則需要加一個字節(jié)端姚。
- 定長字段晕粪,int占四個字節(jié)、date占三個字節(jié)渐裸、char(n)占n個字符巫湘。
- 對于可變字段varchar(n),則有n個字符+兩個字節(jié)昏鹃。
char(n) = (Character Set:utf8mb4=4/utf8=3/gbk=2/latin1=1) * n(列長度) + 1(允許null)
varchar(n) = (Character Set:utf8mb4=4/utf8=3/gbk=2/latin1=1) * n(列長度) + 2(固定值) + 1(允許null)
未完待續(xù)
SQL優(yōu)化
- 待寫作