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, value
float 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 TABLE
、SHOW TABLE STATUS
、SELECT
和EXPLAIN SELECT ...
。有许多种可能的解释;这些信息应该可以很容易地给你答案。
谢谢,我已将该信息添加到 OP
【参考方案1】:
在 InnoDB 中,PRIMARY KEY
与数据“聚集”在一起。换句话说,数据存储在由 PK 排序的 BTree 中。由于这两者(数据和 PK)共存,它们的大小计入 Data_length
(476MB) 而在 Index_length
中没有任何内容。如果您有任何“辅助”键,它们将计入Index_length
。
该表有 4 个 4 字节字段,因此理论上一行应该只占用 16 个字节。请注意,Avg_row_length
是 95。这是因为
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 字节?的主要内容,如果未能解决你的问题,请参考以下文章