数据库架构设计
1 数据库命名规范
1)所有数据库对象名称:
小写加下划线分割
MySQL对象名称在默认情况下是大小写敏感
MySQL的对像其实都是⼀一个⽂文件,而linux文件名是大小写敏感
Dbname / dbname,MyTable / mytable 两个东西
2)所有MySQL数据库对象名称禁⽌止使⽤用MySQL保留关键字
一定要提前准备⼀一份对应版本的关键字表 建表的时候没问题,但SQL查询就挂了了 加``解决
所有的数据库对象名称:见名知义,但最长不不要超过32个字符(不不要中英⽂文混合)
所有临时表命名:tmp_tablename_20191215 所有的备份表:bak_tablename_20191215
索引:idx_ pk_
所有存储类型相同的列名以及长度必须保持一致
order:product_title 50
erp_instock: product_title 50
2 数据库设计规范
正常情况下建议使⽤用innoDB,v5.6版本后默认都是innoDB
字符集 UTF-8 统一字符集避免乱码
UTF-8的字符集是⼀一个汉字3个字节:varchar(255) UTF-8 255*3=765字节
控制单表的数据量大小:单表最大5千万数据
对于⽇日志数据,进行行归档
对于业务数据进行分库分表
分区表谨慎使⽤
禁止在表中建⽴立预留字段:varchar_column 没有实际意义
违背上面的命名规则 时间久了,不看业务代码,完全是魔鬼字段
3 数据库索引设计规范
3.3. 数据库索引设计规范
单张表索引数量建议不不超过5个,如果列多可以适当增加
索引过多:SQL在进行优化器评估的时候会有更大的开销
绝对不允许给表的每一列都建立索引
每个innodb表都必须有⼀一个主键,innoDB表就是⼀一个索引组织表
表数据的实际存储顺序只能有⼀一种,innoDB是按照主键进行存放的 如果没有主键,mysql会优先选择第⼀一个非空唯⼀索引来做主键
如果上面这个没有,mysql会⾃动生成一个36个字节的主键,但性能不好
不能使用更新频繁的列和联合索引做主键,主键不断变,数据的存放顺序就会不断变化
不要使⽤用UUID、MD5、HASH等做主键,不能保证这些值是按顺序增长的。如果生成较小的 字符串就会导致不断变化数据存储的位置,影响I/O性能
要在哪些列列上建立索引:
没有最好只有最适合 explain
where后
join的连接列
筛选项最大的放在索引最左侧
避免建立冗余和重复索引
对于频繁查询的数据列,优先考虑使⽤用覆盖索引
尽量量避免加入外键约束 因为外键写入的时候会降低存储效率 但要给这些关联字段加索引