MySQL开发05-MySQL开发规范

news2025/5/19 18:22:11

文章目录

  • 1、命名规范
  • 2、表设计规范
  • 3、索引规范
  • 4、SQL语句规范
  • 5、SQL脚本规范
  • 6、数据架构规范
  • 7、配置文件建议
  • 8、其他规范
  • 9、总结

1、命名规范

  1. 命名应有意义,包括库名、表名、用户名等,以使用方便记忆、描述性强的可读性名称为第一准则,尽量避免使用缩写或代码来命名。传统使用缩写或代码的方法是出于一些历史原因,比如希望节省空间、尽快加载数据等,但随着硬件的快速发展,目前来说这么做的意义不大。
  2. 命名不要过长(应尽量少于25个字符);
  3. 不要使用保留字;
  4. 数据库、表都用小写,尽量不要使用除下划线、小写英文字母之外的其他字符;
  5. 索引的命名以idx_为前缀;
  6. 如果同一个数据库下有不同的应用模块,则可以考虑对表名用不同的前缀标识;
  7. 注意字段类型的一致性、命名的一致性,同一个字段在不同的表中也应是相同的类型或长度;
  8. 备份表时加上时间标识;

2、表设计规范

  1. 表的存储引擎优先选择InnoDB引擎,字符集建议选择UTF-8。
  2. 每个表都应有主键。
  3. 尽量将字段设置成NOT NULL:NULL值存储需要额外空间,且会导致比较运算更复杂,使优化器更难以优化SQL。
  4. 尽量使用更短小的列。
  5. 尽量使用整型:整型列的执行速度往往更快。整型定义中不需要添加显示长度的值,比如使用INT,而不是INT(4)。
  6. 存储精确浮点数时必须使用DECIMAL替代FLOAT和DOUBLE。
  7. 建议使用UNSIGNED类型存储非负值。
  8. 建议使用INT UNSIGNED存储IPV4:可以使用INET_ATON()、INET_NTOA()函数进行转换,PHP里也有类似的函数如ip2long()、long2ip()。
  9. 不要使用ENUM类型。
  10. 尽量不要使用TEXT、BLOB类型。
  11. 在VARCHAR(N)中,N表示的是字符数而不是字节数,比如VARCHAR(255),最大可存储255个汉字。需要根据实际的宽度来选择N。N应尽可能地小,因为在MySQL的一个表中,所有的VARCHAR字段的最大长度是65535个字节,进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。
  12. 不要在数据库中使用VARBINARY或BLOB存储图片及文件等:MySQL并不适合大量存储这种类型的文件。
  13. JOIN(连接)字段在不同表中的类型和命名要一致。
  14. . 可以把大字段或使用不频繁的字段分离到另外的表中,这样做可以减少表的大小,让表执行得更快。但如果将字段分离了到分离表后,又经常需要建立连接,那可能就会得不偿失了,所以,我们要确保分离的表不会经常进行连。

3、索引规范

  1. 建议单表索引不超过5个,单索引中字段数不超过5个;
  2. 建议索引字段中,选择性高的字段放在前面;
  3. ORDER BY、GROUP BY、DISTINCT的字段需要放在复合索引的后面,也就是说,复合索引的前面部分用于等值查询,后面的部分用于排序。
  4. UPDATE、DELETE语句需要根据WHERE条件添加索引。
  5. 建议不要使用“like %value”的形式,因为MySQL仅支持最左前缀索引。
  6. 对长度过长的VARCHAR字段(比如网页地址)建立索引时,可以增加一个对VARCHAR字段的散列字段,散列字段类型为整型,然后对该散列字段建立索引,这样比对长VARCHAR字段直接排序要好。
  7. 存储域名地址采用反向存储的方法:比如把news.sohu.com存储为com.sohu.news,方便在其上构建索引和进行统计。
    8 . 合理使用复合索引:复合索引(a,b,c)可以用于“where a=?”、“where a=?and b=?”、“where a=?and b=?and c=?”等形式,但对于“where a=?”的查询,可能会比仅仅在a列上创建单列索引查询要慢,因此需要在空间和效率上达成平衡。
  8. 合理利用覆盖索引:由于覆盖索引一般常驻于内存中,因此可以大大提高查询速度。注意把范围条件放到复合索引的最后,WHERE条件中的范围条件(BETWEEN、<、<=、>、>=)会导致后面的条件使用不了索引。

4、SQL语句规范

  • 将对大量数据的增删改操作分割为多批次小数据量的操作:特别是对于业务繁忙的系统,长时间的锁表,可能会导致线上查询被阻塞、应用宕机。解决方案是,尽可能早地释放资源。比如使用LIMIT子句限制每次操作的记录数,也可以利用一些日期字段,基于更小粒度的时间范围进行操作。
  • 尽量避免使用SELECT * 语句:只获取需要的字段。
  • 优先使用预编译语句(prepared statement):可以提高性能并且防范SQL注入攻击。
  • IN列表包含的值不应过多:建议少于100。
  • 尽量避免在UPDATE、DELETE语句中不要使用LIMIT。
  • 尽量避免MySQL进行隐式类型转化。
  • INSERT语句必须显式地指明字段名称:不要使用INSERT INTO table()。
  • 避免在SQL语句中进行数学运算或函数运算,避免将业务逻辑和数据存储耦合在一起。
  • 避免使用存储过程、触发器、函数:这会将业务逻辑和数据库耦合,且存在Bug。
  • 连接的表也不宜过多;
  • 尽量减少和数据库的交互次数;

5、SQL脚本规范

  • 一律优先使用InnoDB引擎和utf8字符集。
  • SQL脚本必须去除M符号。Windows系统中,每行的结尾是“<回车><换行>”,即“\r\n”;Mac系统里,每行的结尾是“<回车>”,即’\r’。Unix/Linux系统里,每行的结尾是换行CR,即“\n”。三个系统行的结尾各不相同,这会导致的一个直接后果是,Unix/Mac系统下的文件在Windows里打开时,所有的文字会变成一行;而Windows里的文件在Unix/Mac下打开,在每行的结尾可能会多出一个M符号。而在SQL脚本中,必须要将此符号去除。
  • 必须保证注释的有效性,建议统一使用“#”进行注释(注:MySQL注释可以使用“--”、“#”或“/**/”,其中“–”后面跟内容时一定要有空格,由于“–”这种注释方法经常导致出错)。
  • SQL文件必须是UTF-8无BOM格式的文件。对于存在非英文字符的升级文件,可以用file命令确认它是否为一个UTF-8编码的文件,如下图:
file  t3.txt

  • 转储数据优先使用mysqldump,因为mysqldump保持了最佳兼容性;

6、数据架构规范

  • 单表数据量控制在5000万以下。

7、配置文件建议

  • 假设我们统一字符集为utf8,统一默认引擎为InnoDB,那么建议默认的配置文件my.cnf如下,这份配置文件没有进行关注性能方面的调整,大家可以对照自己的环境修改或增加适当的参数。
[client]
port            = 3306
socket          = / tmp/mysql.sock
default-character-set = utf8

[mysqld]
character-set-server = utf8
port            = 3306
socket          = /tmp/mysql.sock
user    = mysql
skip-external-locking
max_connections=3000
max_connect_errors=3000
thread_cache_size = 300
skip-name-resolve
server-id       = 1
binlog_format=mixed
expire-logs-days = 8
sync_binlog=60
innodb_log_file_size = 256M
default-storage-engine=innodb
[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
default-character-set = utf8

8、其他规范

  • 批量导入/导出/更新/删除数据时,或者修改表结构等关键动作前,DBA需要进行审查,并在执行过程中观察服务。
  • 业务部门推广活动,要提前通知DBA进行评估。

9、总结

  1. MySQL的对象命名、表和索引的设计、SQL语句和脚本、运维都要遵循规范。
  2. 进行批量导入/导出/更新/删除数据时,或者修改表结构等关键动作前,DBA需要进行审查,并在执行过程中观察服务。

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

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

相关文章

Docker网络案例

bridge 是什么 Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机…

C#基础复习

语句 目录 语句 switch&#xff1a; 跳转语句 标签语句 标签&#xff1a; 标签语句的作用域 goto语句 using 语句 资源的包装使用 using 语句示例&#xff1a; 多个资源和嵌套 语句是描述某个类型或让程序执行某个动作的源代码指令 块在语法上算作一个单条嵌入语句。任何语…

【cmake学习】搭建一个简单的cmake工程(初级版)

目录 1、工程框架介绍 2、编写CMakeLists.txt (1) 限制cmake最低版本、工程命名 (2) 引入头文件目录 (3) 引入库目录&#xff08;可选&#xff09; (4) 引入源文件 (5) 生成可执行文件 / 生成动静态库 (6) 链接库文件&#xff08;可选&#xff09; 3、完整CMakeLists…

uefi 内存管理

PEI 阶段 PEI 阶段最为重要的结构是HOB, 初始化内存服务前&#xff0c;PEI 申请的内存其实是插入到FV 文件 也就是FLASH 里面去运行。 在此状态下&#xff0c;FLASH 可读不可写&#xff0c;所以是不能使用全局变量的。如果有需要模块间共享信息&#xff0c;需要申请HOB. HO…

gtkmm给组件添加css

设置方式 使用CSS分为两步&#xff0c;1:为组件设这css名称&#xff0c;2:加载样式表。 样式表我们写在文件中就行&#xff08;似乎也可以从字符串加载&#xff0c;不过不推荐&#xff09;。 1. 设置css名称 使用gtk的接口&#xff1a;gtk_widget_class_set_css_name()。 这…

rk3568点亮E-ink

rk3568 Android11/12 适配 E-ink “EINK”是英语ElectronicInk的缩写。翻译成中文为“电子墨水”。电子墨水由数百万个微胶囊(Microcapsules)所构成&#xff0c;微胶囊的大小约等同于人类头发的直径。每个微胶囊里含有电泳粒子──带负电荷的白色以及带正电荷的黑色粒子&#…

Ubuntu 交叉编译Windows 版本的ffmpeg最佳实践

之前介绍在Windows上采用msys2+minGW或者cygwin在Windows编译方法。很多读者觉得在Windows搭建一个类Linux比较麻烦或者说方法不够通用,本文就介绍在流行的Linux发行版Ubuntu上编译window版本的ffmpeg。即介绍一种通用办法来编译Windows版本ffmpeg,该方法可以推广到android,…

算法 贪心4 || 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

860.柠檬水找零 很简单的一题&#xff0c;完全是常识题 class Solution { public:bool lemonadeChange(vector<int>& bills) {unordered_map<int,int> map;for(int i 0; i < bills.size(); i){map[bills[i]];if(bills[i] ! 5){if(map[5] 0) return fals…

【Linux】程序中获取和设置cpu和mem相关信息

这里是目录一、CPU和MEM信息1.1、CPU信息1.1.1、CPU核心数1.1.2、CPU频率读取和调整1.1.3、CPU温度1.2、MEM信息二、C程序读取CPU和MEM信息三、测试写在前面&#xff1a; 记录一下日常&#xff0c;之前有做过相关工作&#xff0c;但是没有记录下来&#xff0c;因此写一写文章。…

使用hbuilder连接夜神模拟器调试app

1. Hbuilder设置 这里端口号随便用一个没有被占用的&#xff1b; 路径夜神模拟器的安装路径下的nox_adb.exe的路径。 2. 夜神模拟器设置 设置如下&#xff1a; 工具&#xff0c;设置&#xff0c;关于平板电脑&#xff08;这里应该没有开发者模式选项&#xff0c;这是我配好之…

【LeetCode】剑指 Offer 53. 在排序数组中查找数字 p263 -- Java Version

1. 题目介绍&#xff08;53. 在排序数组中查找数字&#xff09; 面试题53&#xff1a;在排序数组中查找数字 一共分为三小题&#xff1a; 题目一&#xff1a;数字在排序数组中出现的次数题目二&#xff1a;0 ~ n-1 中缺失的数字题目三&#xff1a;数组中数值和下标相等的元素 2…

【创作赢红包】面向对象基础概念

什么是面向对象 面向对象&#xff08;Object Oriented&#xff09;是软件开发方法&#xff0c;一种编程范式&#xff0c;它是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 早期的计算机编程是基于面向过程的方法&#xff0c;如实现算…

前端工程化:环境准备—NodeJs安装-Vue项目开发流程

一、前端工程化-Yapi 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务 地址&#xff1a; http://yapi.smart-xwork.cn/ 具体操作步骤&#xff1a; 1、添加项目 2、添加接口&#xff1a;根据ID查…

技术分享 | observer 资源水位介绍

作者&#xff1a;郭斌斌 爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 OceanBase 集群界面会展示 Observer …

MATLAB绘制柱状/饼图填充图

MATLAB绘制柱状填充图方法1&#xff1a;hatchfill2工具1.1 案例1&#xff1a;柱状图填充1.2 案例2&#xff1a;饼图填充方法2&#xff1a;applyhatch函数2.1 案例1&#xff1a;柱状图填充2.2 案例2&#xff1a;饼图填充方法3&#xff1a; applyhatch_plusC函数3.1 案例1&#x…

Python 小型项目大全 31~35

三十一、猜数字 原文&#xff1a;http://inventwithpython.com/bigbookpython/project31.html 猜数字是初学者练习基本编程技术的经典游戏。在这个游戏中&#xff0c;电脑会想到一个介于 1 到 100 之间的随机数。玩家有 10 次机会猜出数字。每次猜中后&#xff0c;电脑会告诉玩…

Java实现ArrayList和底层源码讲解

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Centos7安装MySQL5.7.30

文章目录1. 环境准备1.1 卸载mariadb1.2 下载MySQL 5.7.301.3 安装MySQL依赖项1.4 创建目录1.5 创建用户和用户组1.6 修改Mysql用户权限2. 安装MySQL2.1 解压2.2 修改解压目录名称2.3 初始化2.4 添加my.cnf异常找不到Sock文件2.5 启动MySQL服务2.5.1 建立软连接2.5.2 启动2.6 设…

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

基于支持向量机的Digits手写数字识别

基于支持向量机的Digits手写数字识别 描述 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;模型既可以用于分类也可以用于回归。手写数字识别是一个多分类问题&#xff08;判断一张手写数字图片是0~9中的哪一个&#xff09;&#xff0c;数据集…