MySQL Explain中key_len的计算

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介:

通常在优化SQL查询的时候,我们都会使用explain分析SQL执行计划,通常来说当用到组合索引的时候我们如何判断索引完全用上呢?当然高手看看表结构及SQL语句就知道到底用到了几个字段,对于不熟悉的同学呢?我们还是可以看看key_len的长度,当然这个计算还是有点复杂的,下面我们来谈谈explain key_len如何计算的。


a.表结构如下:

CREATE TABLE keylen_cal (
  id int(10) NOT NULL,
  tel int(10) DEFAULT NULL,
  first_name varchar(10) NOT NULL,
  last_name varchar(10) DEFAULT NULL,
  father char(10) NOT NULL,
  mother char(10) DEFAULT NULL,  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
b.插入数据
insert into keylen_cal values (1,111,'A','AA','AAA','AAAA');
insert into keylen_cal values (2,222,'B','BB','BBB','BBBB');
insert into keylen_cal values (3,333,'C','CC','CCC','CCCC');
insert into keylen_cal values (4,444,'D','DD','DDD','DDDD');
c创建索引
alter table keylen_cal add index idx_id(id);
alter table keylen_cal add index idx_tel(tel);
alter table keylen_cal add index idx_fn(first_name);
alter table keylen_cal add index idx_ln(last_name);
alter table keylen_cal add index idx_father(father);
alter table keylen_cal add index idx_mother(mother);


d.测试每个key_len的长度

explain select * from keylen_cal where id=3;
##id int(10) NOT NULL,
key_len=4

explain select * from keylen_cal where tel=33;
##tel int(10) DEFAULT NULL,
key_len=5=4+1

alter table keylen_cal modify id(100) NOT NULL;
explain select * from keylen_cal where id=3;
key_len=4

explain select * from keylen_cal where first_name='C'
##first_name varchar(10) NOT NULL,
key_len=32=10*3+2 (utf8占用三个字节)

explain select * from keylen_cal where last_name='CC'
##last_name varchar(10) DEFAULT NULL,
key_len=33=10*3+2+1

explain select * from keylen_cal where father='CCC'
##father char(10) NOT NULL
key_len=30=3*10

explain select * from keylen_cal where mother='CCCC'
##mother char(10) DEFAULT NULL
key_len=31=3*10+1

通过上面的一系列实验,可以总结出来如下规律

  1. 通常情况下, key_len=字段字符数*字符集每个字符所占字节数

  2. default null ,会使 key_len+1

  3. 变长的字段如varchar,会使key_len+2

  4. int ,key_len=4

  5. bigint, key_len=8



相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
3142 10
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
189 3
|
存储 监控 关系型数据库
MySQL计算某条数据与上一条数据的生成时间差
MySQL计算某条数据与上一条数据的生成时间差
387 2
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
755 1
|
SQL 关系型数据库 MySQL
mysql性能调优:EXPLAIN命令21
【7月更文挑战第21天】掌握SQL性能调优:深入解析EXPLAIN命令的神奇用法!
280 1
|
SQL 缓存 关系型数据库
MySQL|浅谈explain的使用
【7月更文挑战第11天】
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
483 158
|
7月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多