explain中key_len的作用

简介: 还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群

mysql explain中key_len的作用

key_len越小 索引效果越好

name的字段类型是varchar(20),字符编码是utf8,一个字符占用3个字节,那么key_len应该是 20*3=60。

               mysql> explain select * from `member` where name='fdipzone'; +----+-------------+--------+------+---------------+------+---------+-------+------+-----------------------+ | id | select_type | table  | type | possible_keys | key  | key_len | ref   | rows | Extra                 | +----+-------------+--------+------+---------------+------+---------+-------+------+-----------------------+ |  1 | SIMPLE      | member | ref  | name          | name | 63      | const |    1 | Using index condition |              

列名

用途

id

每一个SELECT关键字查询语句都对应一个唯一id

select_type

SELECT关键字对应的查询类型

table

表名

partitions

匹配的分区信息

type

单表的访问方法

possible_keys

可能用到的索引

key

实际使用到的索引

key_len

实际使用到的索引长度

ref

当使用索引列等值查询时,与索引列进行等值匹配的对象信息

rows

预估需要读取的记录条数

filtered

某个表经过条件过滤后剩余的记录条数百分比

Extra

额外的一些信息

所以:

1 . 设置字段长度尽量小

2 . 用定长char (key_len会少1)

3 . 用not null(key_len会少1)

key_len表示索引使用的字节数,根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。

char和varchar跟字符编码也有密切的联系,latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)

image.png

1、索引字段为char类型的key_len计算:

(1)允许为Null时

image.png

可以看到key_len=31,这个31是字节长度,它是怎么算出来的呢?让我们一起来分析下:

从表结构可以看到字符集是utf8,那就一个字符3个字节,那么char(10)代表的是10个字符相当30个字节,Null 占1个字节,char类型不需要额外的字节来存储值的的长度,所以得到:key_len:10x3+1=31,可以看到跟上面的结果一致的。

(2)不允许为Null时

image.png

算法和上面差不多,只是字段不允许为Null,所以比上面的例子少了一个字节,key_len=10x3=30

2、索引字段为varchar类型且允许为Null时的key_len计算:

(1)允许为Null时

image.png

还是utf8的字符集,所以还是一个字符3个字节,那么varchar(10)就是10个字符30个字节,Null占一个字节,由于varchar类型需要额外的1~2字节来存储值的的长度:所以key_len:10x3+1+2=33

(2)不允许为Null时

image.png

相信大家都会算了吧,哈哈,不允许为Null就少了一个字符,所以Key_len:10x3+2=32

相关文章
|
17天前
|
数据库
count(1)、count(*)、count(column)的含义、区别、执行效率
总之,`count(1)` 和 `count(*)` 通常会更常用,因为它们的执行效率较高,不涉及对具体列值的处理。而 `count(column)` 适用于统计特定列中的非空值数量。在实际使用时,可以根据情况选择适合的方式。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
12 0
|
9月前
|
SQL 数据可视化 关系型数据库
count(列名) ,count(1)与count(*) 有何区别?
count(列名) ,count(1)与count(*) 有何区别?
|
10月前
|
关系型数据库 MySQL 索引
【MySQL】count(1)、count(*)、count(字段)、count(主键)的区别
【MySQL】count(1)、count(*)、count(字段)、count(主键)的区别
163 0
|
11月前
|
存储 关系型数据库 MySQL
MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析
MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析
114 0
MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析
|
SQL 存储 缓存
【MySQL从入门到精通】【高级篇】(二十四)EXPLAIN中select_type,partition,type,key,key_len字段的剖析
上一篇文章我们介绍了【MySQL从入门到精通】【高级篇】(二十三)EXPLAIN的概述与table,id字段的剖析,重点对EXPLAIN命令进行了阐述,并且对table,id字段进行了剖析。这篇文章接着对EXPLAIN命令的其余字段进行解析,本文将介绍select_type,partition,type,key,key_len 字段的含义。其中:读者朋友们需要重点掌握 select_type,type 两个字段的含义。
208 0
【MySQL从入门到精通】【高级篇】(二十四)EXPLAIN中select_type,partition,type,key,key_len字段的剖析
|
关系型数据库 MySQL 开发者
explain 之key-len 介绍|学习笔记
快速学习 explain 之 key-len 介绍
96 0
explain 之key-len 介绍|学习笔记
|
存储 SQL 架构师
性能大PK count(*)、count(1)和count(列)
最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,聊到了以下内容: 数据统计你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,赶紧改用 count(1),这样比较快...... 有点儿好奇,难道 count(1) 的性能真的就比 count(*) 要好吗? 印象中网上有很多的文章都有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。
性能大PK count(*)、count(1)和count(列)
|
SQL 存储 关系型数据库
key&key_len&ref&filtered(4)—mysql执行计划(五十)
key&key_len&ref&filtered(4)—mysql执行计划(五十)
|
存储 关系型数据库 MySQL
一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别
一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别
242 0
一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别

热门文章

最新文章