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完全一致。