DataBase 的一些规范 ?

1命名规范

1.1表名要有业务意义

1.2避免使用关键字 mysql关键字

1.3库、表、字段全部采用小写

1.4命名(包括表名、列名)禁止超过 30 个字符

1.5临时库、表名必须以 tmp 为前缀,并以日期为后缀;如:tmp_shop_info_20240101;

1.6备份库、表必须以 bak 为前缀,并以日期为后缀;如:bak_shop_info_20240101;

1.7索引命名:非唯一索引必须按照“idx字段名称”进行命名;唯一索引必须按照“uniq字段名称”进行命名。

2 设计规范

2.1、主键:

无特殊要求,主键均按如下语句来设置:

 `id` INT  NOT NULL AUTO_INCREMENT COMMENT '主键',

2.2如无特殊要求,建议都使用 InnoDB 引擎;

2.3字符集默认使用utf8mb4字符集;

数据排序规则使用utf8mb4_general_ci;

原因:utf8mb4为万国码,无乱码风险;与utf8编码相比,utf8mb4能支持Emoji表情。

2.4所有表、字段都需要增加comment来描述此表、字段所表示的含义;

比如:

 data_status TINYINT NOT NULL DEFAULT 1 COMMENT ‘1代表记录有效,0代表记录无效’。

2.5、如无说明,建议表包含create_time和update_time字段,即表必须包含记录创建时间和修改时间的字段;

2.6、用尽量少的存储空间来存放一个字段的数据:

能用 int 的就不用 char 或者 varchar;

能用 tinyint 的就不用 int;

使用 UNSIGNED 存储非负数值;

只存储年使用 YEAR 类型;

只存储日期使用 DATE 类型。

2.7、存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE;

原因:在存储的时候,FLOAT和DOUBLE都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。

-- value列的数据类型为DECIMAL,其中10表示总共有10位数字(加上小数点后2位后10位),2表示小数点后保留2位。这样可以确保浮点数的精确存储和计算。
CREATE TABLE example (id INT PRIMARY KEY,value DECIMAL(10, 2)
);

进行浮点数保存时float,double 和 decimal 的区别:

  • float     4字节

  • double   8字节

  • decimal

小:DECIMAL(M, D),其中M小于等于9。在这种情况下,DECIMAL(M, D)数据类型将使用4个字节进行存储。

中:DECIMAL(M, D),其中M小于等于18,大于9。在这种情况下,DECIMAL(M, D)数据类型将使用8个字节进行存储。

大:DECIMAL(M, D),其中M小于等于65,大于18。在这种情况下,DECIMAL(M, D)数据类型将使用16个字节进行存储。

2.8、尽可能不使用 TEXT、BLOB 类型;

原因:会浪费更多的磁盘和内存空间,非必要的大量大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能。

如果实在有某个字段过长需要使用 TEXT、BLOB 类型,则建议独立出来一张表,用主键来对应,避免影响原表的查询效率。

2.9、禁止在数据库中存储明文密码;

2.10、索引设计规范:

a、需要添加索引的字段

UPDATE、DELETE 语句的 WHERE 条件列;

ORDER BY、GROUP BY、DISTINCT 的字段

JOIN 语句的关联字段

b、单表索引建议控制在 5 个以内;

c、适当配置联合索引;

比如方便查询能走覆盖索引,或者几个字段同时作为条件的概率很高时,可以增加合适的联合索引。

d、业务上具有唯一性的字段,添加成唯一索引;

遇到过几次字段在业务场景上要求唯一,但是该字段在数据库里的数据却出现了重复。因此在代码层考虑外,还需要在 MySQL 上的对应字段添加唯一索引。

e、在 varchar 字段上建立索引时,建议根据实际文本区分度指定索引长度;

原因:可以降低索引所占用的空间,并且很多时候,比如字符串基本是长度大于 20,但是只要建立长度为 20 的索引,就已经有很高的区分度了。可以使用 count(distinct left(列名, 索引长度))/count(*) 的区分度来确定。

f、索引禁忌:

不在低基数列上建立索引,例如:性别字段。

不在索引列进行数学运算和函数运算

2.11、不建议使用外键;

原因:外键会导致表与表之间耦合,update 与 delete 操作都会涉及相关联的表,很影响sql 的执行效率,甚至会造成死锁。高并发情况下容易造成数据库性能下降。

2.12、禁止使用存储过程、视图、触发器、Event ;

原因:高并发的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性。

2.13、单表列数目建议小于30;

3 SQL语句规范

3.1、避免隐式转换;

隐式转换将使用不了索引。

3.2、尽量不使用select *,只select需要的字段 ;

原因:读取不需要的列会增加CPU、IO、NET消耗,并且不能有效的利用覆盖索引。使用SELECT *容易在增加或者删除字段后导致程序报错。

3.3、禁止代码中使用INSERT INTO t_xxx VALUES (xxx),必须显示指定插入的列名 ;

原因:容易在增加或者删除字段后导致程序报错。

3.4、尽量不使用负向查询;

比如 not in/like。

3.5、禁止以%开头的模糊查询;

原因:使用不了索引

3.6、禁止单条SQL语句同时更新多个表;

同时更新多个表的SQL语句可能会变得非常复杂,难以理解和维护。

当出现问题时,排查和修复错误也会更加困难。

3.7、统计记录数使用select count(*)

而不是select count(primary_key)或者select count(普通字段名);

原因:可能会导致走的索引不是最优的或者导致统计数字不准确。

3.8、建议将子查询转换为关联查询;

关联查询通常比子查询执行速度更快。

子查询会在内部执行多次,而关联查询会以更有效的方式一次性检索所需的数据。这可以减少数据库的负载,提高查询性能。

3.9、建议应用程序捕获SQL异常,并有相应处理;

这样,可以大大提升出错时的排查速度

3.10、SQL中不建议使用 sleep(),如特殊需求需要用到sleep(),请提前告知DBA;

可能占用数据库连接和资源,并且可能会在高负载的情况下导致性能下降

4 行为规范

4.1、批量导入、导出数据必须提前通知DBA协助观察;

操作前,可以一起看一下语句是否可以优化,还有就是DBA可以临时关闭一些定时任务(比如备份),方便加快批量导入导出。

另外导入导出过程,可以让DBA关注数据库性能。

4.2、有可能导致MySQL QPS上升的活动,提前告知DBA;

DBA可以评估数据库是否会到瓶颈,或者有些细节是否可以再调整;活动期间,DBA也会观察数据库监控,看数据库是否存在性能问题。

4.3、同一张表的多个alter合成一次操作;

4.4、不在业务高峰期批量更新、查询数据库;

避免影响正常业务

4.5、删除表或者库要求尽量先rename,观察几天,确定对业务没影响,再drop。

这样,防止一些我们不知道的业务还在使用这些库或者表的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/858009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Java中进行单元测试:JUnit 5的使用指南

如何在Java中进行单元测试:JUnit 5的使用指南 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 单元测试是软件开发中的一个关键环节,它…

贪心算法练习题(2024/6/18)

什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心算法一般分为如下四步: 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 1分发饼干 假设你是一位很棒的家长&#xff0c…

pytest测试框架pytest-rerunfailures插件重试失败用例

Pytest提供了丰富的插件来扩展其功能,介绍下插件pytest-rerunfailures ,用于在测试用例失败时自动重新运行这些测试用例。 pytest-rerunfailures官方显示的python和pytest版本限制: Python 3.8pytest 7.2 或更新版本 此插件可以通过以下可…

Scala运算符及流程控制

Scala运算符及流程控制 文章目录 Scala运算符及流程控制写在前面运算符算数运算符关系运算符赋值运算符逻辑运算符位运算符运算符本质 流程控制分支控制单分支双分支多分支 循环控制for循环while循环循环中断嵌套循环 写在前面 操作系统:Windows10JDK版本&#xff…

1027. 方格取数

Powered by:NEFU AB-IN Link 文章目录 1027. 方格取数题意思路代码 1027. 方格取数 题意 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。 在走过的路上,他可以取走方格中的数(取…

ESP32-C3模组上跑通NVS(7)

接前一篇文章:ESP32-C3模组上跑通NVS(6) 上一回讲到乐鑫技术支持发来了操作自定义NVS分区的代码。本回就对于代码进行详细解析,并通过此过程看一下具体应如何进行正确的操作。下边就开始代码分析: 主函数 主函数即app_main()代码如下: void app_main(void) {esp_err_t…

FOC方案大合集!

获取链接!!! 本次小编给大家带来了一份FOC的方案大合集。此套方案是基于峰岹科技FU68系列MCU的系列方案,包含常用的无感,有感无刷电机的应用,每份方案都包含了原理图,PCB,代码文件&…

【TOOL】ceres学习笔记(一) —— 教程练习

文章目录 一、Ceres Solver 介绍二、Ceres 使用基本步骤1. 构建最小二乘问题2. 求解最小二乘问题 三、使用案例1. Ceres Helloworld2. Powell’s Function3. Curve Fitting4. Robust Curve Fitting 一、Ceres Solver 介绍 Ceres-solver 是由Google开发的开源C库,用…

2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供,P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材,P气瓶充装大纲整理而成(含2024年P气瓶…

[Open-source tool]Uptime-kuma的簡介和安裝於Ubuntu 22.04系統

[Uptime Kuma]How to Monitor Mqtt Broker and Send Status to Line Notify Uptime-kuma 是一個基於Node.js的開軟軟體,同時也是一套應用於網路監控的開源軟體,其利用瀏覽器呈現直觀的使用者介面,如圖一所示,其讓使用者可監控各種…

vue3父组件获取子组件的实例对象

一&#xff0c;ref 在父组件的模板里&#xff0c;对子组件的标签定义ref属性&#xff0c;并且设置属性值&#xff0c;在方法里获取ref()获取实例对象。 父组件&#xff1a; <template><div ><div>我是父组件</div><<SonCom ref"sonComRe…

Oracle中生僻汉字的解决办法

在Oracle数据库中处理生僻汉字时&#xff0c;主要面临的问题是某些字符集可能无法完全支持所有的汉字&#xff0c;特别是生僻字。以下是一些解决Oracle中生僻汉字问题的办法&#xff1a; 检查当前字符集&#xff1a; 使用SELECT USERENV(language) FROM dual;命令来查看当前数…

jlink使用记录

https://www.eet-china.com/mp/a79854.html Jlink使用技巧之读取STM32内部的程序stm32芯片解除写保护方法&#xff08;详细&#xff09;_stm32进入写保护如何用segger恢复-CSDN博客 stm32芯片解除写保护方法&#xff08;详细&#xff09; keil程序和jlink两种ccs使用Jlink调试时…

足底筋膜炎的症状

足底筋膜炎是足底的肌腱或者筋膜发生无菌性炎症所致&#xff0c;其症状主要包括&#xff1a; 1、疼痛&#xff1a;这是足底筋膜炎最常见和突出的症状。疼痛通常出现在足跟或足底近足跟处&#xff0c;有时压痛较剧烈且持续存在。晨起时或长时间不活动后&#xff0c;疼痛感觉尤为…

从0到1 Python基础

从0到1 Python基础 文章目录 从0到1 Python基础语法基础流程控制列表与元组字符串字典与集合初始函数**数学计算**日期时间 语法基础 变量&#xff1a;一个可以改变的量 &#xff08;1&#xff09; 变量的命名规则&#xff1a;变量由字母、数字与下划线组成&#xff1b;第一个字…

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画&#xff0c;LITO方式是一样的 首先加入自己的开机动画&#xff0c;制作过程看前面的部分 打开qssi.mk文件&#xff0c;在文件的最后加入内容 PRODUCT_CO…

Python | Leetcode Python题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution:def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:n, m len(dungeon), len(dungeon[0])BIG 10**9dp [[BIG] * (m 1) for _ in range(n 1)]dp[n][m - 1] dp[n - 1][m] 1for i in range(n - 1, -1, …

一文读懂LLM API应用开发基础(万字长文)

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;上一篇文章中我们详细介绍了LLM开发的基本概念&#xff0c;包括LLM的模型、特点能力以及应用&#xff1b;&#x1f632; 在本文中作者将通过&#xff1a…

Redis—Set数据类型及其常用命令详解

文章目录 一、Redis概述Set类型1 SADD:向集合&#xff08;Set&#xff09;中添加一个或多个成员2 SCARD:获取集合&#xff08;Set&#xff09;中成员数量3 SDIFF:获取多个集合之间的差集4 SDIFFSTORE:计算多个集合之间的差集&#xff0c;并将结果存储在指定的目标集合中5 SMEMB…

改进YOLO系列 | ICLR2022 | OMNI-DIMENSIONAL DYNAMIC CONVOLUTION: 全维动态卷积

YOLO系列改进 | ICLR2022 | 全维动态卷积&#xff1a;中文综述 简介 YOLO&#xff08;You Only Look Once&#xff09;是一种目标检测算法&#xff0c;以其速度和精度著称。 本文将介绍YOLO系列的改进&#xff0c;包括ICLR2022上提出的全维动态卷积&#xff08;Omni-Dimensio…