暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

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

原创 aisql 2024-02-01
354

1、数值型存储空间占用

image.png

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

image.png

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

要算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;
复制

image.png
image.png
image.png
image.png
image.png
image.png

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

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

最后修改时间:2024-02-01 20:12:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

目录
  • 1、数值型存储空间占用