腾讯面试题:我设计表的时候,数据字段有什么需要注意的地方吗?(看完你就能和面试官笑谈人生了)
我设计表的时候,数据字段有什么需要注意的地方吗?
(一)数据库基本设计规范:
① 没有特殊要求(即 InnoDB 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用InnoDB存储引擎。MySQL 5.6 以后默认的为 InnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。
② 数据库和表的字符集统一使用 UTF8MB4。兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效。
③ 所有表和字段都需要添加注释。
④ 尽量控制单表数据量的大小,建议控制在 500 万以内。
⑤ 谨慎使用MySQL 分区表。
分区表在物理上表现为多个文件,在逻辑上表现为一个表 谨慎选择分区键,跨分区查询效率可能更低 建议采用物理分表的方式管理大数据。
⑥ 尽量做到冷热数据分离,减小表的宽度。
MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节 减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作)
⑦ 禁止在表中建立预留字段。
⑧ 禁止在数据库中存储图片,文件等大的二进制数据。
⑨ 禁止在线上做数据库压力测试。
⑩ 禁止从开发环境,测试环境直接连接生成环境数据库。
(二)数据库字段设计规范:
① 优先选择符合存储需要的最小的数据类型。
列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多, 索引的性能也就越差。
② 避免使用 TEXT、BLOB 数据类型,最常见的 TEXT 类型可以存储 64k 的数据。
③ 避免使用 ENUM 类型。
④ 尽可能把所有列定义为 NOT NULL。
⑤ 使用 TIMESTAMP(4 个字节)或 DATETIME 类型(8 个字节)存储时间。
⑥ 同财务相关的金额类数据必须使用 decimal 类型。
(三)索引设计规范
① 限制每张表上的索引数量,建议单张表索引不超过 5 个。
- 索引并不是越多越好!索引可以提高效率同样也可以降低效率;索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。
- 因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能。
② 禁止给表中的每一列都建立单独的索引。
③ 每个 InnoDB 表必须有个主键。
- InnoDB 是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种 InnoDB 是按照主键索引的顺序来组织表的。
- 不要使用更新频繁的列作为主键,不适用多列主键(相当于联合索引) 不要使用 UUID、MD5、HASH、字符串列作为主键(无法保证数据的顺序增长)。主键建议使用自增 ID 值。
- 本文作者: feng之锋
- 本文链接: http://example.com/2021/03/21/腾讯面试题:设计表的时候,数据字段有什么需要注意的地方吗/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
