数据库设计三大规范 数据库设计规范( 二 )
【建议】建议用int存储钱字段,在程序端乘以100除以100进行存取 。因为int占4个字节,double占8个字节,所以空浪费了 。
【建议】文本数据尽量存储在varchar中 。因为varchar是变长存储,所以比char节省空时间 。MySQL层规定一行中的所有文本最多存储65,535字节,所以utf8字符集存储的字符数最多为21,844,会自动转换为mediumtext字段 。但是,utf8字符文本中的最大字符数是21,844,mediumtext中的最大字符数是2.24/3,longtext中的最大字符数是2.32 。一般建议使用varchar类型,字符数不要超过2700 。
[建议]时间类型应选择时间戳 。因为datetime占8个字节,timestamp只占4个字节,但是范围是1970-01-01 00:00:01到2038-01-01 00:00:00 。对于高阶方法,选择int存储信息资源网络,使用SQL函数unix_timestamp()和from_unixtime()进行转换 。
有关详细的存储大小,请参见下图:
4.索引设计
【强制】InnoDB表必须有id int/bigint auto_increment作为主键,主键值禁止更新 。
【建议】主键名以“pk_”开头,唯一键以“uk_”或“uq_”开头,普通索引以“idx_”开头,均为小写格式,以表名/字段的名称或缩写作为后缀 。
[必填] InnoDB和MyISAM存储引擎表,索引类型必须是BTREE;内存表可以根据需要选择HASH或BTREE类型的索引 。
[强制]单个索引中每个索引记录的长度不能超过64KB 。
[建议]单个表上的索引数量不应超过7个 。
【建议】建立索引时,考虑建立联合索引,将区分度最高的字段放在最前面 。例如,可以通过select count(distinct userid)计算列userid的区分度 。
【建议】在多表join的SQL中,确保被驱动表的连接列有索引,这样join的执行效率最高 。
[建议]在构建表或添加索引时,确保表内和表内没有多余的索引 。对于MySQL,如果表中已经存在键(a,b),那么键(a)就是冗余索引,需要删除 。
5.子数据库、子表和子表
[强制]分区表的分区字段(分区键)必须有索引,或者组合索引的第一列 。
[强制]单个分区表中的分区(包括子分区)数量不能超过1024 。
【强制】上线前,RD或DBA必须指定分区表的创建和清理策略 。
[强制]访问分区表的SQL必须包含分区键 。
【建议】单个分区文件不要超过2G,总大小不要超过50G 。建议分区总数不要超过20 。
[Force]对分区表的alter table操作必须在业务的低峰期执行 。
[强制]如果采用子数据库策略,数据库数量不能超过1024个 。
【强制】如果采用分表策略,表数不能超过4096 。
【建议】单个子表不要超过500W行,ibd文件大小不要超过2G,使数据分布更好 。
【建议】横向表格尽量按模式划分,日志和报表的数据按日期划分 。
6.字符集
【强制】库的所有字符集,数据库本身的表和列必须一致,是utf8或者utf8mb4 。
【强制】前端程序的字符集或环境变量中的字符集必须与数据库和表的字符集一致,统一为utf8 。
2.SQL编写规范
1.DML语句
【强制】SELECT语句必须指定具体的字段名,禁止写成* 。因为select *也会从MySQL中读出不该读取的数据,造成网卡压力 。而且一旦更新了表字段,但是模型层没有及时更新,系统会报错 。
[强制]insert语句指定具体的字段名,不应该写成insert into t1 values(…) 。原因同上 。
[建议]插入…值(xx)、(xx)、(xx) … 。这里XX的值不应该超过5000 。值太大会造成主从同步的延迟,虽然会很快上线 。
[建议]在SELECT语句中建议使用Union而不是UNION,并且UNION子句的数量应限制在5个以内 。因为union all不需要复制,所以节省了数据库资源,提高了性能 。
[建议]in值列表应限制为500 。例如,select… where userid in(….500或更小…) 。这样做是为了减少底层扫描,减轻数据库压力,加快查询速度 。
【建议】要控制交易中批量更新数据的数量,进行必要的睡眠,做到次数少 。
[强制]事务中涉及的所有表必须是innodb表 。否则如果失败了,就不能完全回滚,容易造成主从库同步终端 。
[强制]写入和事务被发送到主库,只读SQL被发送到从库 。
[强制]除了静态表或小表(100行以内)之外,DML语句必须有一个where条件,并按索引进行搜索 。
【强制】生产环境中禁止使用提示,如sql_no_cache、force index、ignore key、straight join等 。Hint是用来强制SQL按照一定的执行计划执行的,但是随着数据量的变化,我们无法保证自己当初的预测是正确的,只好相信MySQL优化器了!
[强制]在where条件中,等号两边的字段类型必须一致,否则不能使用索引 。
推荐阅读
- 三星|单条1TB内存不是梦 DDR6内存将在2024年完成设计
- 室内设计师证报名入口 中国室内设计网
- 室内设计要学哪些?
- 这真的是鸡蛋的包装设计吗? 鸡蛋包装
- 燕京理工回应高价校园网-三大运营商难进燕京理工学院
- 用工荒|企业招不到人,高薪工作却无人问津,三大行业出现用工荒问题
- 三大运营商4G套餐数量明显减少-5G网络什么时候普及
- 应届生|中国烟草发布招聘,里面的“三大要求”,让多数人望而止步
- 真机|骁龙8+新旗舰!iQOO 10海外版真机曝光:素皮+玻璃拼接设计
- 设计|魅族19粉丝设计图公布:撞色熊猫机吸睛