Mysql学习(九)-- mysql字段的使用
1. 可以使用MySQL直接存储文件吗?
可以使用 BLOB (binary large object),用来存储二进制大对象的字段类型。
- TinyBlob 255 值的长度加上用于记录长度的1个字节(8位)
- Blob 65K值的长度加上用于记录长度的2个字节(16位)
- MediumBlob 16M值的长度加上用于记录长度的3个字节(24位)
- LongBlob 4G 值的长度加上用于记录长度的4个字节(32位)。
1.1 什么时候存,什么时候不存?
- 存:需要高效查询并且文件很小的时候
- 不存:文件比较大,数据量多或变更频繁的时候
1.2 存储的时候有遇到过什么问题吗?
- 上传数据过大sql执行失败 调整max_allowed_packet
- 主从同步数据时比较慢
- 应用线程阻塞
- 占用网络带宽
- 高频访问的图片无法使用浏览器缓存
1.3 Emoji乱码怎么办?
使用utf8mb4
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,一般情况下使用utf8也就够了。
2. 如何存储ip地址?
- 使用字符串
- 使用无符号整型
- 4个字节即解决问题
- 可以支持范围查询
- INET_ATON() 和 INET_NTOA() ipv6 使用 INET6_ATON() 和 INET6_NTOA()
3. 长文本如何存储?
可以使用Text存储
- TINYTEXT(255长度)
- TEXT(65535)
- MEDIUMTEXT(int最大值16M)
- LONGTEXT(long最大值4G)
3.1 大段文本如何设计表结构?
- 或将大段文本同时存储到搜索引擎
- 分表存储
- 分表后多段存储
3.2 大段文本查找时如何建立索引?
- 全文检索,模糊匹配最好存储到搜索引擎中
- 指定索引长度
- 分段存储后创建索引
3.3 有没有在开发中使用过TEXT,BLOB 数据类型
- BLOB 之前做ERP的时候使用过,互联网项目一般不用BLOB
- TEXT 文献,文章,小说类,新闻,会议内容 等
4.日期,时间如何存取?
- 使用 TIMESTAMP,DATETIME
- 使用字符串
4.1 TIMESTAMP,DATETIME 的区别是什么?
跨时区的业务使用 TIMESTAMP,TIMESTAMP会有时区转换
- 两者的存储方式不一样:
- 对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。
- 而对于DATETIME,不做任何改变,基本上是原样输入和输出。
- 存储字节大小不同
数据类型 | MySQL 5.6.4之前需要存储 | MySQL 5.6.4之后需要存储 |
---|---|---|
DATETIME | 8 bytes | 5 bytes + 小数秒存储 |
TIMESTAMP | 4 bytes | 4 bytes + 小数秒存储 |
分秒数精度 | 存储字节大小 |
---|---|
0 | 0 bytes |
1,2 | 1 bytes |
3,4 | 2 bytes |
5,6 | 3 bytes |
- 两者所能存储的时间范围不一样:
timestamp所能存储的时间范围为:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’。
datetime所能存储的时间范围为:‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。
4.2 为什么不使用字符串存储日期?
字符串无法完成数据库内部的范围筛选
在大数据量存储优化索引时,查询必须加上时间范围
4.3 如果需要使用时间戳 timestamp和int该如何选择?
- int 存储空间小,运算查询效率高,不受时区影响,精度低
- timestamp 存储空间小,可以使用数据库内部时间函数比如更新,精度高,需要注意时区转换,timestamp更易读
一般选择timestamp,两者性能差异不明显,本质上存储都是使用的int
5. char与varchar的区别?如何选择?
-
char的优点是存储空间固定(最大255),没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作,所以存储读取速度快。缺点是空间冗余,对于数据量大的表,非固定长度属性使用char字段,空间浪费。
-
varchar字段,存储的空间根据存储的内容变化,空间长度为L+size,存储内容长度加描述存储内容长度信息,优点就是空间节约,缺点就是读取和存储时候,需要读取信息计算下标,才能获取完整内容。
6. 财务计算有没有出现过错乱?
第一类:锁包括多线程,数据库,UI展示后超时提交等
第二类:应用与数据库浮点运算精度丢失
- 应用开发问题:多线程共享数据读写,
- 之前有过丢失精度的问题,使用decimal解决
- 使用乘法替换除法
- 使用事务保证acid特性
- 更新时使用悲观锁 SELECT … FOR UPDATE
- 数据只有标记删除
- 记录详细日志方便溯源
6.1 decimal与float,double的区别是什么?
- float:浮点型,4字节,32bit。
- double:双精度实型,8字节,64位
- decimal:数字型,128bit,不存在精度损失
对于声明语法DECIMAL(M,D),自变量的值范围如下:
- M是最大位数(精度),范围是1到65。可不指定,默认值是10。
- D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。
例如字段 salary DECIMAL(5,2),能够存储具有五位数字和两位小数的任何值,因此可以存储在salary列中的值的范围是从-999.99到999.99。
6.2 浮点类型如何选型?为什么?
-
需要不丢失精度的计算使用DECIMAL
-
仅用于展示没有计算的小数存储可以使用字符串存储
-
低价值数据允许计算后丢失精度可以使用float double
-
整型记录不会出现小数的不要使用浮点类型