架构师必备技能之——MySQL数据库表设计

2023-11-20

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.                                    

目录

  一、总体设计思想

 二、字段相关设计原则

三、索引设计原则

四、SQL操作原则

五、其他原则


 

       
一、总体设计思想


    1.不要在数据库做运算符操作
        数据库服务器资源宝贵,要特别珍惜利用,如果在数据库上做如rand(),md5()等操作,在并发下对服务器很有压力,让数据库多做她擅长的事:尽量不在数据库做运算,复杂运算秱到程序端CPU,尽可能简单应用MySQL。
    2.合理控制数据库表的数据量
        单库不要超过300张表;单表的数据量不要超过5000W。如果要达到较好的体验,数值INT型的,不要超过1000W,字符型的不要超过500W。当数据量超过一定量时候,需要考虑分表,分库操作。
    3.控制好表的列数
        单表字段数上限控制在40个以内,超过的部分,可以考虑附表或者放入其他的表中。列数过多,在insert 数据的时候,就会慢,get的时候,也会慢。
    4.三范式和冗余共存
        并不是每个表的列信息都必须按照三范式来,而是效率优先、提升性能,没有绝对的对与错,适当时牺牲范式、加入冗余。
    5.拒绝三大设置
        大SQL (BIG SQL);大事务 (BIG Transaction);大批量 (BIG Batch);任何的一大,在并发场景下,都可能拖慢服务,甚至让数据库服务器dang掉。


        
二、字段相关设计原则


    1.用好数值字段类型
        使用好INT类型:TINYINT(1Byte)、SMALLINT(2B)、MEDIUMINT(3B)、INT(4B)、BIGINT(8B);使用好浮点型:FLOAT(4B)、DOUBLE(8B);金融类型:DECIMAL(M,D) 
    2.将字符串转换成数字
         数字类型比字符串类型索引的有点是:1、更高效;2、查询更快;3、占用空间更小;例如存储用IP用数字而不用字符串。
    3.优先使用枚举(ENUM)和集合(SET)
        例如:`sex` enum('F','M') COMMENT '性别';`status` enum('0','1','2','3') COMMENT '账户状态';
    4.避免使用NULL做为字段的默认值
        如果使用NULL作为字段的默认值,会导致的情况是:1、很难进行查询优化;2、NULL列加索引,需要额外空间;3、含NULL复合索引无效;
    5.少用并拆分TEXT/BLOB/LONGTEXT
        1、TEXT类型处理性能远低亍VARCHAR;2、强制生成硬盘临时表;3、浪费更多空间;4、VARCHAR(65535)==>64K (注意UTF-8);
        总结:尽量不要用TEXT/BLOB/LONGTEX数据类型,若必须使用则拆分到单独的表。
    6.不要在数据库里存储图片
        存储图片路径,而不是将图片BASE64进行流式存储。
    


三、索引设计原则


    1.谨慎合理的添加索引
        索引的优点是:提高响应时间,改善查询速度;缺点是:更新操作缓慢,添加操作缓慢;原则:索引适可而止,不是越多越好,核心查询字段应该加索引
    2.字符字段应该建立前缀索引
        `order_no` varchar(100) NOT NULL COMMENT '订单编号', //order20220501000000001
        KEY `idx_order_no` (`order_no`(5)),
    3.不要在索引列做运算
        索引列上做的运算会导致:1、索引失效; 2、全表扫描
    4.自增列或全局ID做INNODB主键
        用独立于业务的AUTO_INCREMENT列或全局ID生成器做代理主键,若不指定主键,InnoDB会用唯一且非空值索引代替。
    5.尽量不使用外键
        外键的优点是:外键可节省开发量;可锁其他表;缺点是:高并发时候容易死锁;最好的方案是在程序中保证主外键约束。
    


四、SQL操作原则


    1.SQL语句尽可能的简单
        Simple is beauty!越是简单的SQL语句,越容易操作。一条SQL语句只能在一个CPU中运算,所以巨型SQL极有可能将整个数据库服务器堵死;
        应对方案:将大SQL拆解成若干小SQL,在程序内存中完成数据集的生成。
    2.保持事务连接最小
        要保持事务/数据连接短小精悍:事务/连接即开即用,用完即关。事务只处理事务相关操作,无关操作放在事务之外操作。
    3.尽可能少的使用存储过程,触发器,功能函数
        存储过程、触发器等的使用,都是建立在数据库服务器的CPU上进行的,在并发量上来的时候,会将数据库拖垮、宕机。
    4.不要使用SELECT * 
        select * 的操作会更多消耗CPU、内存、IO、网络带宽等资源,需要什么数据就提取什么数据。
    5.改OR为IN 操作
        注意在 IN 操作时候, IN 控制的值在 200个以内.
    6.改OR为UNION 操作
        UNION操作获取数据合集更利于使用数据库的特性。
    7.避免负向查询和% 前缀模糊查询
        避免负向查询:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等;
        避免 % 前缀模糊查询:B+ Tree使用不了索引,导致全表扫描;
    8.减少COUNT(*)操作
        COUNT(*)的资源开销大,尽量不用少用;
    9.使用 LIMIT 实现高效分页
        Select order_no,user_id from table WHERE id>=100000 limit 10;
    10.用UNION ALL 而非 UNION
        若无需对结果进行去重,则用UNION ALL,UNION有去重开销
    11.分解联接保证高并发(最多可以进行三张表以内的关联查询)
        高幵发DB不建议进行两个表以上的JOIN

五、其他原则


    1.数据库编码都设置成utf8mb4
    2.统一的命名规范,如索引用“idx_xxxxx”
    3.注意避免用保留字命名
    

还有些其他的设计原则,但最主要的,还是都是上面这些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

架构师必备技能之——MySQL数据库表设计 的相关文章

随机推荐

  • 诡异至极的SQL Server推送数据到MQ日期早48小时的生产问题排查

    背景 应用迁移 即旧版应用下线 新版应用上线 停掉旧版应用里面的quartz任务 开启新版的xxl job调度任务 数据推送源头是SQL Server 目的地是MQ 问题爆出 今天iview的自动导出任务从老系统迁移到新系统 下午2点40
  • 【设计模式】工厂模式(Factory Pattern)

    1 概述 工厂模式 Factory Pattern 是最常用的设计模式之一 它属于创建类型的设计模式 它提供了一种创建对象的最佳方式 在工厂模式中 我们在创建对象时不会对客户端暴露创建逻辑 并且是通过一个共同的接口来指向新创建的对象 工厂模
  • docker入门

    Docker基础 docker保姆级教程 https github com yeasy docker practice blob master SUMMARY md Docker系统有两个程序 docker服务端和docker客户端 其中d
  • 安装并配置HBase集群(5个节点)

    安装并配置HBase 集群规划 HBase2 2 5安装 将安装包拷贝到5台机器上并解压缩 配置环境变量 配置HBase 时间同步 修改 usr local src hbase 2 2 5 conf hbase env sh 文件 修改 h
  • SitePoint播客#61:HTML5 =厨房水槽

    Episode 61 of The SitePoint Podcast is now available This week your hosts are Patrick O Keefe iFroggy Stephan Segraves s
  • AWS动手实验 - 创建一个Web3网站

    实验操作和录播 亚马逊云科技开发者社区 web3 dApp demo README CN md at main Chen188 web3 dApp demo GitHub 注意事项 按照操作手册进行即可 需要注意到的几个地方 1 EC2 的
  • C#使用Socket建立连接、通信,主动发送Close关闭, 随后进行下一次的连接,此时会出错,通信端口被占用

    C 使用Socket建立连接 通信之后 主动发送Close关闭 随后进行下一次的连接 此时会出错 通信端口被占用 当你关闭一个Socket连接后 操作系统会在一段时间内保持该端口处于TIME WAIT状态 在这个状态下 该端口是不可用的 直
  • Qt数据类型与强制转换(转)

    类型转换 把QString转换为 double类型 方法1 QString str 123 45 double val str toDouble val 123 45 方法2 很适合科学计数法形式转换 bool ok double d d
  • java源文件命名规则

    Java程序源文件的命名不是随意的 Java文件的命名必须满足如下规则 Java程序源文件的扩展名必须是 java 不能是其他文件扩展名 在通常情况下 Java程序源文件的主文件名可以是任意的 但有一种情况例外 如果Java程序源代码里定义
  • SpringMVC加载流程

    这节介绍SpringMVC SpringMVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架 本章会介绍相关概念 流程 再从源码进行讲解 1 MVC MVC Model View Controller 是一种软件设计
  • Zookeeper(三)—分布式锁实现

    一 独占锁原理 独占锁是利用zk同一目录下不能创建多个相同名称的节点这个特性 来实现分布式锁的功能 竞争锁的分布式系统 都在zk根目录下创建一个名为lock的节点 创建节点成功的系统 说明抢到了这把锁 没有创建成功的系统 说明这个节点已经被
  • 星星之火-22: 什么是手机小区重选?跳槽

    小区重选 cell reselection 指手机在空闲模式下 通过监测邻区和当前小区的信号质量以选择一个最好的小区提供服务信号的过程 选择了一家新公司 并不意味着永久待在一家公司 当前服务的公司 有可能由于经营状况变变糟 薪资水平下降 也
  • 【树莓派4B】darknet-nnpack的安装及使用

    文章目录 前言 步骤 1 下载依赖项 2 安装NNPACK darknet 3 下载darknet nnpack 4 使用YOLO进行预测 检测图像 检测视频 检测视频流 错误处理 make 时报错 undefined reference
  • (二)webpack-server

    宗旨 为了更好的开发和调试 1 package json npm init y 生成package json 2 安装server npm install webpack dev server D 3 修改配置 在package json文
  • canvas绘制一个圆分成六等分颜色随机

  • 基于FPGA的AHT10传感器温湿度读取

    文章目录 一 系统框架 二 i2c接口 三 i2c控制模块 状态机设计 状态转移图 START INIT CHECK INIT IDLE TRIGGER WAIT READ 代码 四 数据处理模块 串口 代码 五 仿真 testbench设
  • vue:实现锚点双向滚动/文章章节联动滚动效果

    文章目录 需求描述 实现思路 示例代码 参考网址 需求描述 需要实现类似doc中文档大纲的效果 点击对应章节的名称时定位到相应的正文 而当正文滚动时 高亮显示对应的章节名称 实现思路 其实笔者一开始想到的是利用a标签页内跳转 也就是 锚点
  • pandas学习笔记--增加行或列

    一 增加行 1 loc 想增加一行 行名称为 5 内容为 16 17 18 19 df loc 5 16 17 18 19 后面的序列是Iterable就行 2 at df at 5 16 17 18 19 3 set value df s
  • CTFShow web1-7——CTF秀WEB模块解题思路

    CTFShow WEB模块详细通关教程 受篇幅所限 通关教程分为上下两部分 第一部分为1 7关 第二部分为8 14关 本篇博客为1 7关的通关教程 从解题思路和原理剖析两个方面进行讲解 CTFShow web1 7关详细教程 解题思路 CT
  • 架构师必备技能之——MySQL数据库表设计

    好记忆不如烂笔头 能记下点东西 就记下点 有时间拿出来看看 也会发觉不一样的感受 目录 一 总体设计思想 二 字段相关设计原则 三 索引设计原则 四 SQL操作原则 五 其他原则 一 总体设计思想 1 不要在数据库做运算符操作 数据库服务器