美文网首页
mysql MySQL数据架构设计

mysql MySQL数据架构设计

作者: dylan丶QAQ | 来源:发表于2020-10-26 15:44 被阅读0次

    起因:在工作中常常要用到mysql,平常只是对数据库crud,并没有认真的了解过她,sql语句也只是会一些最基本的,和常用的,一些不常用的都要去网上百度,即决定学习一下mysql,来了解她,虽然开发很多都是黑盒,但追本溯源总是我们想要的。


    1.数据库架构设计

    做架构到底是在做什什么?
    抽象能力
    抽象-->具象

    • 逻辑设计:
      1、具体内容:设计数据库的⼀一个逻辑结构,与具体的DBMS⽆无关,主要反映业务逻辑
      2、设计步骤:⽤用关系模型
      3、使⽤用⼯工具来模型化:E-R图
          矩形:实体对象 1:m,n:m,1:1
          椭圆:属性
          线:关系的连接
          菱形:关系
      实体关系模型
          通过表格实现:字段名,类型,长度,约束
          实体的实例化和泛化
      至少满足3NF
    • 物理理设计
      对具体数据库进⾏行行选型:oracle,mysql 表的字段及存储结构
    • 实际工作中:都是并行的
    1.1.数据库命名规范
    • 所有数据库对象名称:小写加下花线分割
      MySQL对象名称在默认情况下是大小写敏感
      MySQL的对像其实都是⼀一个文件,而linux文件名是大小写敏感
      Dbname / dbname,MyTable / mytable
      开发非常麻烦

    • 所有MySQL数据库对象名称禁止使用MySQL保留关键字
      一定要提前准备一份对应版本的关键字表
      建表的时候没问题,但SQL查询就挂了了

    • 所有的数据库对象名称:见名知义,但最长不要超过32个字符(不要中英文混合) 所有临时表命名:tmp_tablename_20191215

    • 所有的备份表:bak_tablename_20191215

    • 索引:idx_ pk_

    • 所有存储类型相同的列名以及长度必须保持一致
      order:product_title 50
      erp_instock: product_title 50

    1.2.数据库设计规范
    • 正常情况下建议使⽤用innoDB,v5.6版本后默认都是innoDB

    • 字符集
      UTF-8
      统一字符集避免乱码
      UTF-8的字符集是一个汉字3个字节:varchar(255) UTF-8 255*3=765字节

    • 加入注释

    • 控制单表的数据量大小:行
      对于日志数据,进行归档
      对于业务数据进行分库分表

    • 分区表谨慎使用

    • 控制表宽度
      虽然表没有⾏行行限制,但列列最多4096
      如果列多了,占用内存和I/O会非常大

    • 禁止在表中建立预留字段:varchar_column,order_second_no,remark,memo
      varchar类型
      违背上面的命名规则
      时间久了,不看业务代码,完全是魔鬼字段

    • 禁止在数据库里存放图片、文件、二进制文件
      如果要用blob、Text存大文件,select colums....
      如何避免select * ,外键表单独放单文件

    • 禁止对线上环境进行压力测试
      会产生大量的垃圾数据和日志文件

    • 禁止从开发环境、测试环境连接生产数据库

    1.3.数据库索引设计规范
    • 单张表索引数量量建议不不超过5个,如果列列多可以适当增加
      索引过多:SQL在进行优化器评估的时候会有更大的开销
      绝对不允许给表的每一列都建立索引
    • 每个innodb表都必须有一个主键,innoDB表就是一个索引组织表
      表数据的实际存储顺序只能有一种,innoDB是按照主键进行存放的
      如果没有主键,mysql会优先选择第一个非空唯一索引来做主键
      如果上面这个没有,mysql会自动⽣生成一个36个字节的主键,但性能不好
      不能使用更新频繁的列和联合索引做主键,主键不断变,数据的存放顺序就会不断变化
      不要使用UUID、MD5、HASH等做主键,不能保证这些值是按顺序增长的。如果⽣生成较小的字符串就会导致不断变化数据存储的位置,影响I/O性能
    • 要在哪些列上建立索引:没有最好只有最适合
      explain
      where 后
      join的连接lie
      筛选项最大的放在索引做左侧
    • 避免建立冗余和重复索引
    • 对于频繁查询的数据列列,优先考虑使用覆盖索引
    • 尽量避免加入外键约束
      因为外键写入的时候会降低存储效率
      但要给这些关联字段加索引
    1..4. 数据库字段设计规范
    • 优先选择符合存储需要的最小数据类型
      INT来存放时间戳
      varchar(255) '长袖衬衫'
    • 避免使用TEXT,BLOB数据类型
      如果非要使用可以单独拉出来做关联表
      这两个类型上没有默认值
    • 避免使用ENUM数据类型
      修改则需要使用ALTER语句
    • 尽可能把所有列列定义为NOT NULL
      如果为NULL,索引需要额外的空间来保存
    • 日期格式尽量不要用字符串保存
      不能用日期函数进行计算和比较
      用字符串占用的空间更更多
      1970-01-01 00:00:00-2038-01-19 03:14:07
      int来保存:4294967295
      财务相关的数据用Decimal类型来进行计算
    1.5. 数据库SQL开发规范
    • 在程序中使用PrepareStatement,#{}
      降低词法和语法分析器器的重复执行
      防止SQL注入
    • 合理理和充分的利用表上的索引
      避免前后%
      使用left join或not exists来优化not in(not in无法使用索引)
    • 程序连接不同数据库使用不同的账号,禁止跨库操作
      应用A---B 应用D---C:跨库访问最好调用业务层
      如果账号被注入,也只注入⼀一个库
    • 禁止使用select *(但是依旧这么做)
    • 禁止使用不含列列名的insert into tableName values('','','');
    • 避免使用子查询,可以把子查询优化为join操作
      子查询的结果集无法使用索引
      子查询会产生临时表操作,如果查询量大则会严重影响效率
    • 避免使用join关联太多表
      ⼤大查询拆小查询,由我们的程序来去做关联和合并
      进行表数据冗余
      有一定的转换
    • 减少同数据库的交互次数
    • 使⽤用in代替or,in能⽤用索引,or用不上
    • 禁⽌止用order by rand()
    • where中不要对列进行函数计数:列无法使用索引了
    • UNION ALL和UNION
      如果我们的数据明显不重复,就使用UNION ALL
      程序=数据结构+算法
    1.6. 数据库操作行为规范
    • 大批量的数据操作会严重造成数据延迟
      数据分批执行
      v5.7 format_binlog:row
    • 对大表结构的操作会导致锁表
      对于大表的操作:pt-online-schema-change (PERCONA)
      原理
      创建新表结构
      复制旧表数据到新表
      在原表上加入触发器确保数据同步
      所有操作进行完毕后对原表进入一个很短的时间锁
      把原表名进行修改,再改新表名
      删除原表名
      原⼦子性操作分割进行了
    • 禁止对普通用户授予super权限
    • 对于程序遵循最小权限原则

    不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

    相关文章

      网友评论

          本文标题:mysql MySQL数据架构设计

          本文链接:https://www.haomeiwen.com/subject/xgodyktx.html