MySQL使用规范_心得总结

文章目录

  • 命名规范
  • 数据库基本设计规范
  • 数据库字段设计规范
  • 索引设计规范
  • 常见索引列建议
  • 数据库开发规范
  • 数据库操作行为规范

命名规范

1.所有数据库对象名称必须使用小写字母并用下划线分割
2.禁止使用 MySQL 保留关键字,如果表名中包含关键字查询时,需要使用单引号括起来
3.见名识意
4.名称不要超过 32 个字符
5.临时库表以 tmp_ 为前缀并以日期为后缀,备份表以 bak_ 为前缀并以日期为后缀
6.所有存储相同数据的列名和列类型必须一致,一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低
7.列名不要带上表名,例如,student 表中的列 idname 等,不要命名成 student_idstudent_name

数据库基本设计规范

1.没有特殊要求下,所有表必须使用 innodb 存储引擎
支付事务、行级锁、更好的恢复性、高并发下性能更好

2.数据库和表的字符集统一使用 utf8
统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效

3.所有表和字段都需要添加注释
使用 comment 从句添加表和列的备注进行数据字典的维护

4.尽量控制单表数据量的大小,建议控制在500万以内
过大的数据量,在修改表结构、备份、恢复都会有很大的问题。

5.谨慎使用分区表
分区表在物理上表现为多个文件,在逻辑上表现为一个表,跨分区查询效率可能更低,建议采用物理分表的方式管理大数据

6.尽量做到冷热数据分离,减小表的宽度
MySQL 限制每个表最多存储4096列,并且每一行数据在大小不能超过65535字节

7.减少磁盘IO
保证热数据的内存缓存命中率,避免读入无用的冷数,经常一起使用的列放到一个表中避免更多的关联操作。

8.禁止在表中建立预留字段
无法确认存储的数据类型,对预留字段类型的修改会对表进行锁定

9.禁止在数据库中存储图片,文件等大的二进制数据
IO操作耗时,通常存储于文件服务器,数据库只存储文件地址信息

10.禁止在线上做数据库压力测试

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

数据库字段设计规范

1.优先选择符合存储需要的最小的数据类型
字段大,建立索引空间大,IO次数多,索引性能差

2.将字符串转换成数字类型存储
例如,IP地址在插入数据前先用 inet_aton() 函数把 IP 地址转为整型,节省空间,显示数据时使用 inet_ntoa() 函数把二进制整数转成 IP 地址字符串显示即可。

3.对于非负的整数,建议使用无符号整数类型存储
例如,自增 ID,要优先使用无符号整型来存储,无符号相对于有符号可以多出一倍的存储空间

SIGNED INT:-2147483648~2147483647
UNSIGNED INT:0~4294967295

4.VARCHAR(N) 中的 N 代表的是字符数,而不是字节数
使用 UTF8 存储 255 个汉字 varchar(255)=765 个字节。过大的长度会消耗更多的内存,避免使用 text、blob 数据类型,最常见的 text 类型可以存储 64K 的数据,可以分离到单独的扩展表中。
MySQL 内存临时表不支持 text/blob 大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行,MySQL 还要进行二次查询,会使 SQL 性能变得很差,不需要 text 类型的列的数据时不要对该列进行查询。
text/blob 类型只能使用前缀索引,并且text列上是不能有默认值的。

5.避免使用 enum 类型
修改 enum 值需要使用alter语句;
enum 类型的order by 操作效率低,需要额外操作;
禁止使用数值作为enum的枚举值。

6.尽可能把所有列定义为 not null
索引 null 列需要额外的空间来保存,所以要占用更多的空间;
进行比较和计算时要对 null 值做特别的处理。

7.使用 timestamp 4 个字节 或 datetime 类型 8 个字节存储时间
TIMESTAMP 存储的时间范围 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07
TIMESTAMP 占用 4 字节和 INT 相同,但比 INT 可读性高;
超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储。

8.同财务相关的金额数据必须使用 decimal 类型

非精准浮点:float,double
精准浮点:decimal

Decimal 类型为精准浮点数,在计算时不会丢失精度。占用空间由定义的宽度决定,每 4 个字节可以存储 9 位数字,并且小数点要占用一个字节。可用于存储比 bigint 更大的整型数据。

索引设计规范

1.限制每张表上的索引数量,不超过 5 个,索引可以增加查询效率,同样也会降低插入和更新的效率,有些情况下会降低查询效率

因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能。

2.禁止给表中的每一列都建立单独的索引

使用联合索引查询

每个索引组织表 innodb 必须有个主键–数据的存储的逻辑顺序和索引的顺序是相同的,每个表都可以有多个索引,但是表的存储顺序只能有一种 innodb 是按照主键索引的顺序来组织表的。

3.不要使用更新频繁的列作为主键

4.不要使用 uuid md5 hash 字符串列作为主键

无法保证数据的顺序增加

6.主键建议使用自增ID值

常见索引列建议

1.出现在 select update delete 语句的 where 从句中的列

2.包含在order by group by distinct 中的字段

3.多表join的关联列

4.建立联合索引效果更好

5.索引列的顺序
区分度最高的放在联合索引的最左侧 ,区分度 = 列中不同值的数量 / 列的总行数
尽量把字段长度小的列放在联合索引的左侧

6.避免建立冗余索引和重复索引

重复索引示例:primary key(id)、index(id)、unique index(id)
冗余索引示例:index(a,b,c)、index(a,b)、index(a)
  
7.优先考虑覆盖索引
就是包含了所有查询字段(where select order by group by )的索引
避免lnnodb表进行索引的二次查询

8.尽量避免使用外键约束
但要在表与表之间的关联键上建立索引,外键建议在业务端实现参照完整性
外键会影响父表和子表的写操作从而降低性能

数据库开发规范

1.建议使用预编译语句进行数据库操作
减少编译所需要的时间;
还可以解决动态 sql 所带来的 sql 注入问题;
只传参数,比传递 sql 语句更高效,相同语句可以一次解析,多次使用,提高处理效率。

2.避免数据类型的隐式转换

3.充分利用表上已经存在的索引
避免使用双 % 号的查询条件

4.一个 sql 只能利用到复合索引中的一列进行范围查询
例如,有 a、b、c 列的联合索引,在查询条件中有 a 列的范围查询,则在 b、c 列上的索引将不会被用到,在定义联合索引时,如果 a 列要用到范围查找的话,就要把 a 列放到联合索引的右侧
  
5.使用 left join 或 not exists 来优化 not in 操作  
因为 not in 也通常会使用索引失效。

6.数据库设计要充分考虑扩展性

程序连接不同的数据库使用不同的账号跨库查询
为数据库迁移和分库分表留出余地
降低业务耦合度

7.禁止使用 select *,应该使用 select column1, column2,... 查询

8.禁止使用不含字段的 insert into 语句

9.避免使用子查询,可以把子查询优化为 join 操作
子查询结果无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引。

10.避免使用 JOIN 关联太多的表
关联缓存大小可以由 join_buffer_size 参数进行设置,最多允许关联 61 个表,建议不超过 5 个。

11.减少同数据库的交互次数

批量执行脚本语句,可以提高处理效率

12.对列的值进行 or 判断时,使用 in 代替 or

可以更有效的利用索引,or 很少能利用到索引;
in 的值不要超过 500 个。

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

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

因为无法使用索引

15.在明显不会有重复值时使用 union all 而不是 union

union 会把两个结果集的所有数据放到临时表中后再进行去重操作,union all 不会对结果集进行去重操作

16.拆分复杂的大 SQL 为多个小 SQL

大 SQL 逻辑上比较复杂,需要占用大量 CPU 进行计算;
MySQL 一个 SQL 只能使用一个 CPU 进行计算,拆分成多个小 SQL 语句可能通过并行执行来提高处理效率

数据库操作行为规范

1.删除匿名账户,并且给 root 账户设置登录密码

刚安装好的 MySQL 包含一个含空密码的 root 帐户和两个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,所以我们要把匿名帐户删除,并且为 root 帐户设置密码,可用如下命令进行:

mysql> use mysql;
mysql> delete from user where user="";
mysql> update user set password=password('newpassword') where user='root';

2.超100万行的批量写操作,要分批多次进行操作

大批量修改数据,一定是在一个事务中进行的,这就会造成表中大批量数据进行锁定,从而导致大量的阻塞

3.对于大表使用 pt-online-schema-change 修改表结构

避免大表修改产生的主从延迟,避免在对表字段进行修改时进行锁表
pt-online-schema-change 首先建立一个与原表结构相同的新表,并且在新表上进行表结构的修改,然后再把原表中的数据复制到新表中,并在原表中增加一些触发器,把原表中新增的数据也复制到新表中,所有数据复制完成之后,把新表命名成原表,并把原表删除掉。

4.禁止为程序使用的账号赋予 super 权限

对于程序连接数据库账号,遵循权限最小原则。

在进行开发和实际应用中,用户不应该只用 root 用户进行连接数据库,虽然使用 root 用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。

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

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

相关文章

java界面 文件选择器_掌握java技术 必备java工具应用知识

在现如今的互联网时代里,Java无疑是一种极为流行的开发语言,无论是程序界还是整个互联网行业势必带来很大的影响。不管是人才需求还是薪资水平上,Java的发展前景都是很乐观的。关于Java的一些常用的工具,也是需要我们不断去掌握和…

php制作404,利用thinkphp怎么制作一个404跳转页面

利用thinkphp怎么制作一个404跳转页面发布时间:2020-12-14 15:46:55来源:亿速云阅读:97作者:Leah本篇文章给大家分享的是有关利用thinkphp怎么制作一个404跳转页面,小编觉得挺实用的,因此分享给大家学习&am…

junit 验证日志输出_JUnit规则–引发异常时执行附加验证

junit 验证日志输出在本文中,我将快速向您展示如果您需要解决以下挑战,那么JUnit规则有多方便 一个方法可以捕获异常,并且必须在抛出或引发包装异常之前执行一些额外的任务。 调用额外任务和引发的异常应通过单元测试进行验证。 这意味着你…

禅道项目管理系统里面的「产品」与「项目」的区别和关系

产品与项目的区别和关系 产品主要是管理需求、计划和发布。一个产品可能分解成多个小项目,由一个或多个项目组去完成。 项目主要是管理任务开发需求。禅道里,项目对应的是敏捷开发里的迭代。项目可以看做产品的迭代管理,一个项目更新产品的…

triplet loss后面不收敛_你的神经网络真的收敛了么?

1、为什么小模型的作为backbone效果会差?在深度学习目标检测(图像分割)领域,我们发现当我们使用层数越深,并且在imagenet上表现越好的分类网络作为backbone时,它的检测和分割效果越好效果越好。比如我们使用resnet101作为backbone…

php文件上传漏洞waf,文件上传绕过WAF

文件上传文件上传实质上还是客户端的POST请求,消息主体是一些上传信息。前端上传页面需要指定enctype为multipart/from-data才能正常上传文件。此处不讲各种中间件解析漏洞只列举集几种safe_dog对脚本文件上传拦截的绕过靶机环境:win2003safe_dog4.0.239…

java性能监视_Java 9和应用程序性能监视的激动人心之处

java性能监视通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用! 在当今的现代计算时代,软件创新的不断增强使我们更接近软件革命的时代。 也许在遥远的未来,这可能是对21世纪记忆…

Windows 系统如何查看本机的 IP 地址

查询本机外网IP地址 1.百度直接搜索“IP地址”,就可以看到了 2.输入命令curl -L tool.lu/ip 查询本机内网IP地址 1.控制面板-网络连接-查看属性 2.输入命令命令ipconfig或者ipconfig/all

C# 监控字段_有哪些好的C#开源项目推荐?

作者:码云 Gitee链接:https://www.zhihu.com/question/27993498/answer/1014561869

matlab 传输速率,处理速率转换 - MATLAB Simulink - MathWorks 中国

示例模型打开示例模型 rtwdemo_ratetrans。这种多速率、多任务模型包含几个在不同模式下运行的 Rate Transition 模块。open_system(rtwdemo_ratetrans);set_param(rtwdemo_ratetrans,SystemTargetFile,ert.tlc);set_param(rtwdemo_ratetrans,GenerateComments, Off);将 Rate T…

并行流 线程池_使用自定义线程池处理并行数据库流

并行流 线程池并行数据库流 在上一篇文章中 ,我写了关于使用并行流和Speedment并行处理数据库内容的文章。 在许多情况下,并行流可能比通常的顺序数据库流快得多。 线程池 Speedment是一个开源的Stream ORM Java工具包和Runtime Java工具,它…

MySQL关于check约束无效的解决办法

首先看下面这段MySQL的操作,新建一个含有a和b的表,其中a用check约束必须大于0,然而插入了一条(-2,1,1)的数据,其中a-2,也是成功插入的。 所以MySQL只是check,但是不强制check。 mysql> create table c…

hibernate框架 最新_java框架,使用最频繁的9个程序!

Java在多年的发展历程中,已证明自己是为软件开发而生的顶级通用编程语言。Java 广泛用于科学和教育,金融,法律和政府等许多行业。Java 是开源和面向对象的,其开发目的是使应用程序开发人员可以编写一次然后在任何地方运行。编译后…

php遍历目录与文件夹,介绍几种php遍历目录与文件夹的方法

介绍几个php遍历目录的方法,可以遍历目录及目录中的文件,供大家参考遍历目录或遍历目录下指定类型的文件,这是每一个童鞋在写程序的时候难免会用到的。PHP本身也提供了很多灰常有用的函数,正确地使用它们,不会有错滴。…

twilio_15分钟内使用Twilio和Stormpath在Spring Boot中进行身份管理

twilio建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了! 今天,不到30秒左右…

unity webgl读写txt文件_python Files文件读写操作

今天学习python的Files文件读写操作,并记录学习过程欢迎大家一起交流分享。首先新建一个文本文件test.txt,内容如下:hello worldhello youhello mehello pythonhello universe然后新建一个python文件命名为py3_file.py,在这个文件中进行操作代…

matlab表达式,表达式 - MATLAB Simulink - MathWorks 中国

数组运算符如果矩阵不用于线性代数运算,则成为二维数值数组。数组的算术运算按元素执行。这意味着,加法和减法运算对数组和矩阵都是相同的,但乘法运算不相同。MATLAB 的乘法数组运算表示法中包含点,也就是小数点。运算符列表包括加…

数据库表的约束条件

文章目录1.主键约束2.非空约束3.唯一约束4.检查约束5.外键约束1.主键约束 主键约束可以用两种方式定义:列级主键约束和表级主键约束 列级主键约束演示: create table dept_htlwk( deptno varchar(20) primary key, --列级约束条件 dname varchar(20)…

垃圾收集 java_Java的内置垃圾收集如何使您的生活更美好(大部分时间)

垃圾收集 java通过从您的应用程序学习企业APM产品,发现更快,更有效的性能监控。 参加AppDynamics APM导览! “无需为用户编写将寄存器返回到自由存储列表的程序。” 这条线(以及随后的十几条线)被埋在约翰麦卡锡&…

python函数的使用方法_百度资讯搜索_python函数的使用方法

金生水起程序猿 2020年11月22日 11:23函数语法格式及调用参数:默认值、元组和字典可变参数的使用全局变量和局部变量作用域,局部变量如何升级为全局变量函数是可重复使用的,实现单一功能的代码块。可以把项...百度快照金生水起程序猿 2020年11月22日 12:13函数类型定义:python中…