MySQL:为啥我的索引长度是 0.0 字节?

Posted

技术标签:

【中文标题】MySQL:为啥我的索引长度是 0.0 字节?【英文标题】:MySQL: Why is my index length 0.0 bytes?MySQL:为什么我的索引长度是 0.0 字节? 【发布时间】:2015-06-23 21:42:35 【问题描述】:

我有一个包含 4 列的简单表格。

A列(整数),B列(整数),C列(整数),D列(整数)

我在(B 列、A 列、C 列)上构建了一个索引,该索引在性能方面表现良好。我的表包含 500 万行,并且使用索引来选择所需的行可以立即工作(

然而,在检查表时,我发现我的索引长度为 0.0 字节。为什么?我的索引怎么可能不占用内存?

信息:

显示创建表 kpi_store_hour

创建表kpi_store_hour (kpiID int(11) NOT NULL, companyID int(11) NOT NULL, timestamp int(11) NOT NULL, valuefloat NOT NULL, 主键 (@ 987654326@,companyID,timestamp) ) ENGINE=InnoDB 默认字符集=utf8

显示表格状态

名称:kpi_store_hour

引擎:InnoDB

版本:10

行格式:紧凑

行数:4973952

平均行长度:95

数据长度:476037120

最大数据长度:0

索引长度:0

免费数据:6291456

自动增量:NULL

创建时间:2015-03-04 11:14:06

更新时间:NULL

检查时间:NULL

排序规则:utf8_general_ci

校验和:NULL

SELECT * FROM kpi.kpi_store_hour WHERE kpiID = 0 AND companyID = 1 AND timestamp

持续时间/获取:0.000 秒 / 0.000 秒

EXPLAIN SELECT * FROM kpi.kpi_store_hour WHERE kpiID = 0 AND companyID = 1 AND timestamp

id:1

select_type:简单

表:kpi_store_hour

类型:范围

可能的键:主要的

键:主要

key_len: 12

参考:NULL

行数:743

额外:使用 where

【问题讨论】:

请提供SHOW CREATE TABLESHOW TABLE STATUSSELECTEXPLAIN SELECT ...。有许多种可能的解释;这些信息应该可以很容易地给你答案。 谢谢,我已将该信息添加到 OP 【参考方案1】:

在 InnoDB 中,PRIMARY KEY 与数据“聚集”在一起。换句话说,数据存储在由 PK 排序的 BTree 中。由于这两者(数据和 PK)共存,它们的大小计入 Data_length (476MB) 而在 Index_length 中没有任何内容。如果您有任何“辅助”键,它们将计入Index_length

该表有 4 个 4 字节字段,因此理论上一行应该只占用 16 个字节。请注意,Avg_row_length 是 95。这是因为

每列的开销 每行的开销 BTree 的开销 还有一些 PRIMARY KEY 的开销。

key_len: 12 -- 这意味着使用了 PK 中的 3 个 4 字节字段...

WHERE kpiID = 0 AND companyID = 1 AND timestamp < 1353792707 可以用kpiID = 0 AND companyID = 1 在BTree 中快速向下钻取到第一行,然后扫描直到timestamp < 1353792707 失败。并且估计会遇到 743 行。

【讨论】:

我明白了。我试图确定索引长度的原因是为了了解索引会随着我的表增长多少。非常感谢您的回答!

以上是关于MySQL:为啥我的索引长度是 0.0 字节?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 中如何计算一个索引的长度

为啥 MySQL 不使用我的索引进行 JOIN?

mysql 开发基础系列15 索引的设计和使用

为啥 MySQL 在使用 DATE(`table`.`column`) 时会删除我的索引

MySQL索引的设计和使用

mysql中 varchar(20)我的数据长度超过了,varchar不是自动增长的吗,为啥他把后面超过的内容给截了。