zoukankan      html  css  js  c++  java
  • MySQL explain 中key_len的计算

    key_len表示索引使用的字节数,根据这个值可以判断索引的使用情况,特别是在组合索引的时候,判断该索引有多少部分被使用到非常重要。

    在计算key_len时,下面是一些需要考虑的点:
    索引字段的附加信息:
    1.可以分为变长和定长数据类型讨论;
    2.当索引字段为定长数据类型时,如char,int,datetime,需要有是否为空的标记,这个标记占用一个字节(对于not null来说不需要这一个字节);
    3.当索引字段为变长数据类型时,如varchar,除了是否为空的标记外,还需要有长度信息,需要占用两个字节
    4.对于char,varchar,blob,text等,key_len的长度还和字符集有关,latin1 一个字符占用一个字节,gbk 一个字符占用两个字节,utf8 一个字符占用三个字节

    例如:

    列类型   KEY_LEN 备注
    id int key_len = 4+1 int为4bytes,允许为NULL,加1byte
    id bigint not null key_len=8 bigint为8bytes
    user char(30) utf8 key_len=30*3+1 utf8每个字符为3bytes,允许为NULL,加1byte
    user varchar(30) not null utf8 key_len=30*3+2 utf8每个字符为3bytes,变长数据类型,加2bytes
    user varchar(30) utf8 key_len=30*3+2+1 utf8每个字符为3bytes,允许为NULL,加1byte,变长数据类型,加2bytes
    detail text(10) utf8 key_len=30*3+2+1 TEXT截取部分,被视为动态列类型

    备注:

    key_len只表示了where中用于条件过滤时被选中的索引列,是不包含order by / group by 这一部分被选中的索引列的

    例如:

    有一个联合索引idx(a1,b2,c3),三列均是 int not null,那么下面的执行计划中key_len的值是8,不是12

    select .... from table where c1=? and c2=? order by c1;

  • 相关阅读:
    【UVA11324】 The Largest Clique (Tarjan+topsort/记忆化搜索)
    【洛谷2245】 星际导航 (最小瓶颈路)
    【UVA10816】Travel in Desert (最小瓶颈路+最短路)
    【洛谷 5002】专心OI
    炸金花【大模拟】
    【BZOJ1055】[HAOI2008]玩具取名(区间DP)
    【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)
    NOIP前的模板
    获取<考试>博文密码!o(*≧▽≦)ツ
    这是个萌新的萌新博客
  • 原文地址:https://www.cnblogs.com/hankyoon/p/12656855.html
Copyright © 2011-2022 走看看