当前位置: 首页 > 编程笔记 >

浅谈mysql explain中key_len的计算方法

艾望
2023-03-14
本文向大家介绍浅谈mysql explain中key_len的计算方法,包括了浅谈mysql explain中key_len的计算方法的使用技巧和注意事项,需要的朋友参考一下

mysql的explain命令可以分析sql的性能,其中有一项是key_len(索引的长度)的统计。本文将分析mysql explain中key_len的计算方法。

1、创建测试表及数据

CREATE TABLE `member` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(20) DEFAULT NULL,
 `age` tinyint(3) unsigned DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `member` (`id`, `name`, `age`) VALUES (NULL, 'fdipzone', '18'), (NULL, 'jim', '19'), (NULL, 'tom', '19');

2、查看explain

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 |
+----+-------------+--------+------+---------------+------+---------+-------+------+-----------------------+

explain的key_len为63,多出了3

name字段是允许NULL,把name改为NOT NULL再测试

ALTER TABLE `member` CHANGE `name` `name` VARCHAR(20) NOT NULL;

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 | 62   | const |  1 | Using index condition |
+----+-------------+--------+------+---------------+------+---------+-------+------+-----------------------+

现在key_len为62,比刚才少了1,但还是多了2。可以确定,字段为NULL会多占用一个字节。

name字段类型为varchar,属于变长字段,把varchar改为char再测试

ALTER TABLE `member` CHANGE `name` `name` CHAR(20) NOT NULL;

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 | 60   | const |  1 | Using index condition |
+----+-------------+--------+------+---------------+------+---------+-------+------+-----------------------+

改为定长字段后,key_len为60,与预测的一致。

总结:使用变长字段需要额外增加2个字节,使用NULL需要额外增加1个字节,因此对于是索引的字段,最好使用定长和NOT NULL定义,提高性能。

以上这篇浅谈mysql explain中key_len的计算方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍浅谈PostgreSQL消耗的内存计算方法,包括了浅谈PostgreSQL消耗的内存计算方法的使用技巧和注意事项,需要的朋友参考一下 wal_buffers默认值为-1,此时wal_buffers使用的是shared_buffers,wal_buffers大小为shared_buffers的1/32 autovacuum_work_mem默认值为-1,此时使用maintenance_

  • 本文向大家介绍浅谈c# 浮点数计算,包括了浅谈c# 浮点数计算的使用技巧和注意事项,需要的朋友参考一下 给大家看个计算题,看看大家的算术能力。 0.1 +0.1 +0.1 - 0.3 等于几? 大家可能会说这么简单的问题,是不是看不起我?肯定等于0啊。 如果大家直接算的是没有问题的,但是如果用计算机呢? 见证奇迹的时刻到了,看代码: 运行结果: 这是因为计算机的精度的问题,在计算机的内部存储和运算

  • 本文向大家介绍浅谈PHP中的<<<运算符,包括了浅谈PHP中的<<<运算符的使用技巧和注意事项,需要的朋友参考一下 PHP中提供了<<<运算符构建多行字符串序列的方法,通常称为here-document或表示为heredoc的简写。 这种方法详细表述了字符串的字面值,并在文本中保留了字符串的下划线和其他空格(包括缩进)。例如: PHP解析器会将两个_END标签中间的所有内容输出,就相当于一个用双引

  • 本文向大家介绍浅谈C++中replace()方法,包括了浅谈C++中replace()方法的使用技巧和注意事项,需要的朋友参考一下 本文主要针对c++中常用replace函数用法给出九个样例程序: 用法一:  运行结果: 用法二:  运行结果: 用法三:  运行结果: 用法四:string转char*时编译器可能会报出警告,不建议这样做  运行结果: 用法五:string转char*时编译器可能会

  • 本文向大家介绍浅谈javascript中replace()方法,包括了浅谈javascript中replace()方法的使用技巧和注意事项,需要的朋友参考一下 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。 语法 stringObject.replace(regexp/substr,replacement) 返回值 一个新的字符串,是

  • 本文向大家介绍浅谈python中统计计数的几种方法和Counter详解,包括了浅谈python中统计计数的几种方法和Counter详解的使用技巧和注意事项,需要的朋友参考一下 1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. 2) 使用defaultdict() defaultdict(