学习MySQL,怎么能不会数据类型和schema优化( 二 )

  • 长度相近 , 例如MD5;
  • 经常更新 。
  • 除了 VARCHAR 和 CHAR , 针对存储大字符串 , 可以使用 BLOB 和 TEXT 类型 。 BLOB 和 TEXT 的区别在于 , BLOB 是以二进制方式存储 , 而TEXT是以字符方式存储 。 这也导致 , BLOB 类型的数据没有字符集的概念 , 无法按字符排序 , 而 TEXT 类型则有字符集的概念 , 可以按字符排序 。 两者的使用场景 , 也由存储格式决定了 , 当存储二进制数据时 , 例如图片 , 应使用 BLOB , 而存储文本时 , 例如文章 , 则应使用TEXT类型 。
    四、日期和时间类型MySQL中所能存储的最小时间粒度为秒 , 常用的日期类型有DATETIME和TIMESTAMP 。
    类型存储内容空间大小(Byte)时区概念DATETIME格式为YYYYMMDDHHMMSS的整数8无TIMESTAMP从1970年1月1日零点以来的秒数4有TIMESTAMP显示的值将依赖于时区 , 意味在不同时区查询到的值将不一样 。 除了以上列出的不同 , TIMESTAMP还具有一个特殊属性 , 在插入和更新时 , 如果没有指定第一个TIMESTAMP列的值 , 将会设置这个列的值为当前时间 。
    我们在开发过程中 , 应尽量使用TIMESTAMP , 主要是因为其空间大小仅需DATETIME的一半 , 空间效率更高 。
    【学习MySQL,怎么能不会数据类型和schema优化】如果我们想存储的日期和时间精确到秒之后 , 怎么办?由于MySQL并未提供 , 所以我们可以使用BIGINT存储微妙级别的时间戳 , 或者使用DOUBLE存储秒之后的小数部分 。
    五、选择标识符通常来说整数是标识符的最好选择 , 主要是因为其简单 , 计算快 , 且可使用AUTO_INCREMENT 。
    学习MySQL,怎么能不会数据类型和schema优化文章插图
    范式和反范式简单来说 , 范式就是一张数据表的表结构所符合的某种设计标准的级别 。 第一范式 , 属性不可分割 , 现在的RDBMS系统建成的表都是符合第一范式的 。 而第二范式 , 则是消除非主属性对码(可以理解为主键)的部分依赖 。 第三范式消除非主属性对码的传递依赖 。 具体的介绍 , 可以读读知乎上的这个回答()
    严格范式化的数据库中 , 每个事实数据会出现且只出现一次 , 不会出现数据冗余 , 这样所能带能带来的好处有:
    1. 更新操作更快;
    2. 修改更少的数据;
    3. 表更小 , 更好地放内存中 , 执行操作更快;
    4. 更少需要 DISTINCT 或 GROUP BY 。
    但也由于数据分散存在各张表中 , 查询时需要对表进行关联 。 而反范式的优点则是不用进行关联 , 将数据冗余存储 。
    在实际应用中 , 不会出现完全的范式化或完全的反范式化 , 时常需要混用范式和反范式 , 使用部分范式化的schema , 往往是最好的选择 。 关于数据库设计 , 在网上看到这样一段话 , 大家可以感受下 。
    数据库设计应该分为三个境界:
    第一境界:刚入门数据库设计 , 范式的重要性还未深刻理解 。 这时候出现的反范式设计 , 一般会出问题 。
    第二境界:随着遇到问题解决问题 , 渐渐了解到范式的真正好处 , 从而能快速设计出低冗余、高效率的数据库 。
    第三境界:再经过N年的锻炼 , 是一定会发觉范式的局限性的 。 此时再去打破范式 , 设计更合理的反范式部分 。
    范式就像武侠里面的招数 , 初学者妄想不按招数来 , 只能死的很难堪 。 毕竟招数都是高手总结归纳的精华 。 而随着武功提高 , 招数熟练之后 , 必然是发现招数的局限性 , 要么忘掉招数 , 要么自创招数 。
    只要努力 , 加上多熬几年 , 总能达到第二个境界 , 总会觉得范式是经典 。 此时能不过分依赖范式 , 快速突破范式局限性的人 , 自然是高手 。
    学习MySQL,怎么能不会数据类型和schema优化文章插图
    缓存表和汇总表除了上述说到的反范式 , 在表中存储冗余数据 , 我们还可以创建一张完全独立的汇总表或缓存表 , 来满足检索的需要 。
    缓存表 , 指的是存储可以从schema其他表中获取数据的表 , 也就是逻辑上冗余的数据 。 而汇总表 , 则指的是存储使用GROUP BY等语句聚合数据 , 计算出的不冗余的数据 。
    缓存表 , 可用于优化搜索和检索查询语句 , 这里可以使用的技巧有对缓存表使用不同的存储引擎 , 例如主表使用InnoDB , 而缓存表则可使用MyISAM , 获得更小的索引占用空间 。 甚至可以将缓存表放到专门的搜索系统中 , 例如Lucene 。
    汇总表 , 则是为了避免实时计算统计值所带来的高昂代价 , 代价来自两方面 , 一是需要扫描表中的大部分数据 , 二是建立特定的索引 , 会对UPDATE操作有影响 。 例如 , 查询微信过去24小时的朋友圈数量 , 则可固定每1小时扫描全表 , 统计后写一条记录到汇总表 , 当查询时 , 只需查询汇总表上最新的24条记录 , 而不必每次查询时都去扫描全表进行统计 。