欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL规范

程序员文章站 2022-04-23 12:45:38
一,设计规范 三大范式 第一范式1NF:属性不可分【反例:address可1分为国家,省市,地区】 第二范式2NF:属性完全依赖主键 【反例:订单编号和商品编号位于同一张表中,前者与订单信息强相关,后者与商品信息强相关】【该拆表了】 第三范式3NF:不允许数据冗余【两张表很多属性相同】 命名规范 1 ......

一,设计规范

三大范式

第一范式1nf:属性不可分【反例:address可1分为国家,省市,地区】

第二范式2nf:属性完全依赖主键

【反例:订单编号和商品编号位于同一张表中,前者与订单信息强相关,后者与商品信息强相关】【该拆表了】

第三范式3nf:不允许数据冗余【两张表很多属性相同】


命名规范

1,命名规范:小写+下划线,不能使用保留关键字

【mysql对象名默认规定大小写敏感,且在生产环境中mysql通常运行在linux系统下,linux系统本身也是大小写敏感的。】

建议在设计数据表之后逐一排查有没有使用关键字。】


字段规范

原则:

  • 尽可能选择存储空间最小的字段【栗子:ip转化为整型存储】、
  • 非负型数据优先使用无符号存储

1,char vs varchar

​ char 定长 浪费空间 查询速度快

​ varchar 变长 节省空间 查询速度较慢

出于存储空间的考虑,优先选择varchar


2,避免使用text,blob,如果一定要使用,单独出扩展表

​ 【mysql内存临时表不支持text,blob这样的大数据类型,只能使用磁盘临时表完成,并且会导致二次查询】


3,同财务相关的最好使用定点数decimal


4,日期类型选择

  • datetime:记录年月日时分秒,表示的时间范围最大
  • 如果记录的日期要让不同时区的人使用,使用timestamp



其他规范

1,为什么选择innodb?【行级锁高并发,支持事务,缓存索引和数据,支持热备】


2,字符集通常选用utf-8


3,所有表和字段都需要添加注释


4,禁止在数据库中存储图片,文件等大的二进制数据

通常存储于文件服务器,数据库只存储文件地址信息


5,尽可能把所有列定义为 not null



二,索引规范

索引的适用情况

  1. 对于非常小的表、大部分情况下简单的全表扫描比建立索引更高效。
  2. 对于中到大型的表,索引就非常有效。


添加索引的位置

where子句中的字段


联合索引

联合索引又称为复合索引,指查询中同时包含多个索引。

最左前缀匹配原则:mysql遵循最左优先,所以在where子句中通常将使用最频繁的索引放在前面


索引使用注意事项

  • 单表索引最好不超过5个【索引可以提高查询效率,但是同时会减小插入更新效率】



三,开发规范

  • 禁止使用 select * 必须使用 select 查询字段列表>

  • 禁止使用 order by rand() 进行随机排序

  • where 从句中禁止对列进行函数转换和计算

  • 拆分复杂的大 sql 为多个小 sql

    • 大 sql 逻辑上比较复杂,需要占用大量 cpu 进行计算的 sql
    • mysql 中,一个 sql 只能使用一个 cpu 进行计算
    • sql 拆分后可以通过并行执行来提高处理效率
  • 在明显不会有重复值时使用 union all 而不是 union

    • union 会把两个结果集的所有数据放到临时表中后再进行去重操作
    • union all 不会再对结果集进行去重操作
  • 用join操作代替子查询

  • 使用join关联的表最好不超过5个

  • 对应同一列进行 or 判断时,使用 in 代替 or

  • 外键是否需要问题

    对于互联网行业,注重高并发,不推荐使用外键。【外键的本质就是将数据一致性交给数据库处理】

    对于传统软件行业,对并发量没有那么高,通过使用外键来降低开发成本也是可取的



参考资料

一份非常完整的mysql规范