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

MySQL: Why is my index length 0.0 bytes?

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

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

我已经在(B 列、A 列、C 列)上构建了一个索引,在性能方面效果很好。我的 table 包含 500 万行,并且使用 select 所需行的索引可以立即工作(<0.00 秒)。

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

信息:

SHOW CREATE TABLE kpi_store_hour

创建 TABLE kpi_store_hour ( kpiID int(11) NOT NULL, companyID int(11) NOT NULL, timestamp int(11) NOT NULL, value float NOT NULL, PRIMARY KEY (kpiID,companyID,timestamp) ) ENGINE=InnoDB 默认字符集=utf8

SHOW TABLE STATUS

姓名:kpi_store_hour

引擎:InnoDB

版本:10

Row_format:紧凑

行数:4973952

Avg_row_length: 95

Data_length: 476037120

Max_data_length: 0

Index_length: 0

Data_free: 6291456

Auto_increment: 空

Create_time: 2015-03-04 11:14:06

Update_time: 空

Check_time: 空

整理:utf8_general_ci

校验和:NULL

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

Duration/fetch:0.000 秒/0.000 秒

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

id: 1

select_type:简单

table: kpi_store_hour

类型:范围

possible_keys:主要

键:主要

key_len: 12

ref: NULL

行数:743

额外:使用 where

在 InnoDB 中,PRIMARY KEY 是 "clustered" 数据。换句话说,数据存储在由 PK 排序的 BTree 中。由于两者(数据和 PK)共存,因此它们的大小计入 Data_length (476MB) 而 Index_length 中没有任何内容。如果您有任何 'secondary' 键,它们将被计入 Index_length.

table有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行。