MySQL数据类型存储空间占用数值型

2024年 2月 1日 31.9k 0

1、数值型存储空间占用

我整理了一下带上范围,附下表

decimal类型的空间占用算法有点复杂。我看官方文档先没有看懂,后面不断实践,总结出来了。我这里先贴一下官方原文档

要算decimal(M,D) 占多大存储空间。是下面四部份之和
1、 (M-D) div 9 * 4
2、 D div 9 * 4
3、 N1=(M-D) mod 9 然后用N1值在上图 leftover digits 中对应找占多大空间
4、 N2=D mod 9 然后用N2值在上图 leftover digits 中对应找占多大空间

我写了一个SQL可直接查
如:

set @m =20,@d = 10;
select (@M-@D) div 9 *4 + @d div 9 *4 + case (@M-@d) mod 9
when 0 then 0
when 1 then 1
when 2 then 1
when 3 then 2
when 4 then 2
when 5 then 3
when 6 then 3
when 7 then 4
when 8 then 4
end +
case @d mod 9
when 0 then 0
when 1 then 1
when 2 then 1
when 3 then 2
when 4 then 2
when 5 then 3
when 6 then 3
when 7 then 4
when 8 then 4
end as size

假设一个 decimal(20,10) 的声明, 用上面SQL计算出来 会占用 10 bytes

我们可以利用explain 的key_len的特性来做验证。以下为验证过程

构造测试数据与索引

drop table if exists abcde;
create table abcde
(
tt1 numeric(8,0) not null,
tt2 numeric(6,1)not null,
tt3 numeric(8,1)not null,
tt4 numeric(10,1)not null,
tt5 numeric(20,10)not null,
tt6 numeric(18,4)not null
) ;
alter table abcde add index idx1(tt1), add index idx2(tt2),add index idx3(tt3),add index idx4(tt4),add index idx5(tt5),add index idx6(tt6);
-- 这里用到了mysql的demo库 sakila
insert into abcde
select payment_id,payment_id,payment_id,payment_id,payment_id,payment_id from sakila.payment;

通过explain的ken_len来验证上面的SQL查空间占用大小对不对

explain
select * from abcde where tt1 = 200;
explain
select * from abcde where tt2 = 200;
explain
select * from abcde where tt3 = 200;
explain
select * from abcde where tt4 = 200;
explain
select * from abcde where tt5 = 200;
explain
select * from abcde where tt6 = 200;






上面为explain 的依次结果。关注key列与key_len列

用每个索引列的M,D定义带入我上面的计算SQL,得到的size与ken_len完全一致。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论