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行。
我有一个包含 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行。