数据类型
int:
select pow(2,31) - 1 有符号最大值
select pow(2,32) 无符号,最大值
select pow(2,31) 负数最大值
int 无符号最大42亿 也就够用来 做主键了。(每天写入不超过100万就没事)
每天写100万,能写10年。
DB:table(字段,索引),存储过程,触发器,事件,视图(表就是视图)
decimal 会转成浮点数进行运算,会出现四舍五入情况。(可以考虑存成int 单位为分)
前面整个字节长度,后面是 小数点占用的位数。
decimal(10,0)占用10个字节==int(10)占用4个字节,不要犯这种错。
bit bit(M) #m用于表示,有多少个二进制位(0101),M可以支持0-64位,varbinary可以存储更多(select 不到,程序可读)。
int(4) 不是允许存4位,只是显示宽度。
int(4) zerofill 写入数字5,显示:0005
int(11) auto_increment 每次自增加1
datetime 占用4个字节(推荐使用,5.6及以后可以更新当前时间)
日期转换:select cast('2017-04-10 14:38:14.0697' as date);,select now()+0
5.6新增两个函数可以打印出毫秒:
select now(4),select microsecond(now(4));
char(10),存储1个字符自动补全到10个字符
varchar(10),存储1个字符就占一个字符,低于255字节需要1个字节记录格式信息overhead,大于255字节需要2个字节,。varchar最多存储65535字节
innodb_file_format #antelope格式可存储255字节,之后在overflow,barracuda超过20个字节,存储到其他page上,设计时把字符列放到最后。因为最小的列在一个page上,更好读出来。
myisam 索引长度最高1000,innodb索引长度最高767
longblob(binary)没有字符集校验,longtext有字符集校验。
varchar,utf8字符集。最多存储(65535-2)/8
图片存储到binary&blob 等二进制字段里面,(图片存储可以调用mongo的DFS,百度云,360云盘)
文件格式b开头,varchar 占用20个字节。
索引列不要使用更新频繁的列。where 条件索引选择度,每个字段加上not null。
超过30%可能不走索引。选择度30%以下可以建立索引,控制在10%最好。查询超过30%一般不建索引。
多列索引(a,b,c)相当于(a),(ab),(abc)
两表做join,字符类型或字符集不一样,面临类型转换,索引失效。
select * from tb where i_c1 = and v_c2 (两个列都是索引,优化器使用哪个?)实际上选哪个都不对。SQL:成本优化,RBO:基于规则 rule base opt(谁在前使用谁)。CBO:基于代价 cost base opt。
新版本有index merge,早期也有比较坑。。5.6和5.7好多都在使用RBO,没有直方图。