mysql - 解释一下MySQL中这个表中的key_len

标签 mysql optimization indexing query-optimization sql-execution-plan

我有一个包含一列的表格:

|姓氏 | varchar(1000) | varchar(1000) |否 |乘法 |空 | |

我在此列上创建了索引:
在员工(last_name)上创建索引lastname_idx;

当我对 last_name 上有 WHERE 条件的 SELECT 执行 EXPLAIN 时,我看到:< br/> key_len = 769

如果我没记错的话,key_len 显示索引值中使用的字节。
由于索引位于 last_name 上,即 varchar(1000),为什么是 key_len=769
不应该是1000吗?

最佳答案

InnoDB 的默认行格式仅将字符串列的前导部分(最多 768 字节)存储在与其他列一起的页面上。任何多余的内容都存储在表空间另一段的“blob 页”上。

InnoDB 对 VARCHAR、BLOB、TEXT、VARBINARY 等(所有“可变长度”数据类型)使用相同的存储方法。有关更多存储详细信息,请参阅http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

看来 InnoDB 自动假定索引前缀长度等于它可以内联存储的列部分。你使用的是MySQL 5.6吗?我不记得在早期版本中看到过这种行为(它只会提示,并且您必须声明索引前缀长度)。

当您使用 varchar 时,EXPLAIN 报告的 key_len 总是包含一些额外的字节。

关于mysql - 解释一下MySQL中这个表中的key_len,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256738/

相关文章:

mysql - XAMPP中配置tomcat出错

PHP - 计算 MySQL 查询中的元素返回双倍的元素数

Python PULP 不支持的操作数类型 TypeError

c# - '|' vs ' ||' C#中的编译器优化

python - 我如何找到字符串中多个子字符串的位置(Python 3.4.3 shell)

php - 我可以在 MYSQL 查询中使用 '$_POST(s)' 字符串吗?

mysql - 将一个表连接到另一个表的 MAX 记录

ruby - 如何输出数组中元素的索引,这些元素也在另一个数组中?

python - 如何获取特定标签之前/之前的 n 个索引号?

phpmyadmin auth 加密协议(protocol)