> 文章列表 > Mysql学习(九)-- mysql字段的使用

Mysql学习(九)-- mysql字段的使用

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 存储的时候有遇到过什么问题吗?

  1. 上传数据过大sql执行失败 调整max_allowed_packet
  2. 主从同步数据时比较慢
  3. 应用线程阻塞
  4. 占用网络带宽
  5. 高频访问的图片无法使用浏览器缓存

1.3 Emoji乱码怎么办?

使用utf8mb4

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,一般情况下使用utf8也就够了。

2. 如何存储ip地址?

  1. 使用字符串
  2. 使用无符号整型
    • 4个字节即解决问题
    • 可以支持范围查询
    • INET_ATON()INET_NTOA() ipv6 使用 INET6_ATON()INET6_NTOA()

3. 长文本如何存储?

可以使用Text存储

  • TINYTEXT(255长度)
  • TEXT(65535)
  • MEDIUMTEXT(int最大值16M)
  • LONGTEXT(long最大值4G)

3.1 大段文本如何设计表结构?

  1. 或将大段文本同时存储到搜索引擎
  2. 分表存储
  3. 分表后多段存储

3.2 大段文本查找时如何建立索引?

  1. 全文检索,模糊匹配最好存储到搜索引擎中
  2. 指定索引长度
  3. 分段存储后创建索引

3.3 有没有在开发中使用过TEXT,BLOB 数据类型

  • BLOB 之前做ERP的时候使用过,互联网项目一般不用BLOB
  • TEXT 文献,文章,小说类,新闻,会议内容 等

4.日期,时间如何存取?

  1. 使用 TIMESTAMP,DATETIME
  2. 使用字符串

4.1 TIMESTAMP,DATETIME 的区别是什么?

跨时区的业务使用 TIMESTAMP,TIMESTAMP会有时区转换

  1. 两者的存储方式不一样:
    • 对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。
    • 而对于DATETIME,不做任何改变,基本上是原样输入和输出。
  2. 存储字节大小不同
数据类型 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
  1. 两者所能存储的时间范围不一样:
    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的区别?如何选择?

  1. char的优点是存储空间固定(最大255),没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作,所以存储读取速度快。缺点是空间冗余,对于数据量大的表,非固定长度属性使用char字段,空间浪费。

  2. varchar字段,存储的空间根据存储的内容变化,空间长度为L+size,存储内容长度加描述存储内容长度信息,优点就是空间节约,缺点就是读取和存储时候,需要读取信息计算下标,才能获取完整内容。

6. 财务计算有没有出现过错乱?

第一类:锁包括多线程,数据库,UI展示后超时提交等

第二类:应用与数据库浮点运算精度丢失

  1. 应用开发问题:多线程共享数据读写,
  2. 之前有过丢失精度的问题,使用decimal解决
  3. 使用乘法替换除法
  4. 使用事务保证acid特性
  5. 更新时使用悲观锁 SELECT … FOR UPDATE
  6. 数据只有标记删除
  7. 记录详细日志方便溯源

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

  • 整型记录不会出现小数的不要使用浮点类型