测试 not null 针对key length的影响

init测试数据:

CREATE TABLE `test_range` (
  `aa` int(11) ,
  `bb` varchar(60) ,
  `cc` datetime ,
  `dd` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  KEY `cc` (`cc`,`aa`)
) ENGINE=InnoDB


##create table test_range(aa int not null, bb varchar(60) not null, cc datetime not null, dd TIMESTAMP)
##alter table test_range add key(cc,aa)

drop procedure if exists data_init_test1;

create procedure data_init_test1()
begin
    DECLARE start_flag int;
    DECLARE date_flag date;
    DECLARE list_length int;
    set start_flag = 0;
    set date_flag = CURDATE();
    set list_length = 10000;
    while start_flag < list_length DO
        insert into test_range(aa, bb, cc) values(start_flag, start_flag, date_flag);
        set date_flag = date_add(date_flag, INTERVAL 1 day);
        set start_flag = start_flag + 1;
    end while;
end;

##call data_init_test1()




####MySQL5.1测试

int类型aa ,未加not null,

datetime类型cc, 未加not null


desc select * from test_range where cc = '2014-08-14' and aa = 25;

explain的结果:
key: cc (这个是复合索引(cc,aa))
key_len: 14

也就是cc这个复合索引里,cc索引是9个字节(比datetime的4个字节增长一倍+1个字节 ) aa索引是5个字节(比int类型增长1个字节)


##把两个字段加上not null后

alter table test_range change aa aa int not null 

alter table test_range change cc cc int not null


desc select * from test_range where cc = '2014-08-14' and aa = 25;

explain的结果:
key: cc (这个是复合索引(cc,aa))
key_len: 12

也就是跟base类型一样的长度,记得某些类型,或者某些情况下,它的长度会增大N倍的,所以。。。注意了。



####MySQL5.5测试

效果一样,db本身没优化。


所以坚决用not null default xxx



并且有一点需要注意。datetime从null改成not null 后,它原来的数据格式会转成年的。

如果给值datetime to 一个整型,默认模式下,它会初始成年份。

线上要注意。



另外:


据说。。Mysql 能够实现松散索引扫描时,就能在一个索引上使用多个范围条件,那也就不需要把range改成in了。。。但是复现不了。。。5.6.。。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

折腾数据折腾代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值