gpt4 book ai didi

MySQL 减少存储空间

转载 作者:行者123 更新时间:2023-11-29 13:59:51 24 4
gpt4 key购买 nike

我有一个表定义:

CREATE TABLE `k_timestamps` (
`id` bigint(20) NOT NULL,
`k_timestamp` datetime NULL DEFAULT NULL,
`data1` smallint(6) NOT NULL,
KEY `k_timestamp_key` (`k_timestamp`,`id`) USING BTREE,
CONSTRAINT `k_time_fk` FOREIGN KEY (`id`) REFERENCES `data` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

基本上,我有很多 iddata1 键值对,每隔几个小时我就会添加以前未见过的新键值对到列表,或者之前的 id 值已更改。我想及时跟踪每个 id 的所有值。因此,id 列可以包含重复的 id,并且不是主键。

旁注,k_time_fk 指向另一个小得多的表,该表具有特定 id 的通用信息,无论当前时间是什么或其当前保存的值。

(id, k_timestamp) 应被视为表的(复合)主键。

例如,

id          k_timestamp            data1
1597071247 2012-11-15 12:25:47 4
1597355222 2012-11-15 12:25:47 4
1597201376 2012-11-15 12:25:47 4
1597071243 2012-11-15 13:25:47 4
1597071247 2012-11-15 13:25:47 3
1597071249 2012-11-15 13:25:47 3

无论如何,我运行了这个查询:

SELECT concat(table_schema,'.',table_name), 
concat(round(table_rows/1000000,2),'M') rows,
concat(round(data_length/(1024*1024*1024),2),'G') DATA,
concat(round(index_length/(1024*1024*1024),2),'G') idx,
concat(round((data_length+index_length)/(1024*1024*1024),2),'G') total_size,
round(index_length/data_length,2) idxfrac
FROM information_schema.TABLES ORDER BY data_length+index_length DESC LIMIT 20;

要提取我的 table 上的空间信息:

rows      Data     idx       total_size  idxfrac
11.25M 0.50G 0.87G 1.36G 1.76

我不太确定我是否理解这一点,索引怎么会占用这么多空间?我在这里做错了什么明显的事情,还是这是正常的?如果可能的话,我希望尝试减少该表的占用空间。我什至不确定 k_timestamp_key 到底能为我买什么,它可以安全删除吗?

最佳答案

索引更大,因为当您没有可以将其视为唯一索引的唯一列时,InnoDB 表将分配一个 6 字节主键。表中的所有其他索引也包含主键...请参阅 14.2.3.12.2. Clustered and Secondary Indexes来自手册

关于MySQL 减少存储空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com