前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL中的哥哥表、妹妹字段,是什么鬼?

MySQL中的哥哥表、妹妹字段,是什么鬼?

作者头像
xjjdog
发布于 2021-01-11 07:44:59
发布于 2021-01-11 07:44:59
1.6K0
举报
文章被收录于专栏:架构专题架构专题

晚上,我被叫进宽大的办公室,总监正在煮茶。高压锅煮着长嘴茶壶,水蒸气缭绕。领导举手之间,淡黄茶水奔涌而出,倒立而下浇上茶叶,漏出两杯茶水。

“喝茶?”领导推给我一杯,然后自己抿了一口。沉默良久,把显示器转到我这边:“最近数据库表出现了些有意思的东西,你来看看”。

我探着脑袋一瞧,心凉了半截。

时隔五年,又在项目里见到哥哥表和妹妹字段,着实让我坐立不安。所谓哥哥表,就是名称叫做gg的数据库表,意为公共;所谓妹妹字段,就是名称叫做mm的表子段,意为密码。比起shit mountain来,这些命名更让人浮想联翩,实为不规范之典范。

这么魔幻的事情,不止一次出现,任何领导都会坐不住。可惜的是,一次次的会议,专项讨论某一个SQL禁止条例,到最后还是大开方便之门,过往的规范承诺皆抛之脑外。

数据库命名规范是最基础的规范,连这个都没做好,证明监管工作确实出现了纰漏。我赶紧掏出自己的手机,翻到xjjdog的文章,打算把数据库要注意的点,给领导汇报一下。

也顺便向大家汇报。

我把规范分成了统一的规范、索引规范、SQL规范、命名规范、安全规范、性能小Case等6个部分。

请听我慢慢道来。

1. 统一的规范

首先,我们来一些通用的规范。这里有很多是经验值,如果你的数据库所在的宿主机硬件,并不是十分的牛X,可以考虑再降低一下标准。

存储引擎: 请统一使用innodb存储引擎,特殊的数据库引擎必须通过DBA的评审。

字符集:统一使用utf8字符集。这个要从应用程序、服务器、数据库的表、字段等全部统一起来。注意:MySQL中的utf8mb4字符集,才是真正的utf8,请用这个。

作用范围:不要在MySQL存储大对象,比如图片、音乐等;不要用MySQL做Gis运算、全文检索;不使用存储过程、触发器、函数、外键,避免破坏数据库的性能和扩展性。

使用上限:

  • 每个MySQL实例,数据库不要超过50个;
  • 单数据库容量,不要超过500GB,否则分库;
  • 单表记录数量,不要超过5000W,否则分表;
  • 单表子段数量,不要超过30个,否则拆表;
  • 单张表中索引数量不超过5个,单个索引中的字段数不超过5个;
  • varchar字段最大值不超过1024;注意:VARCHAR(N)中的N表示字符数而非字节数

2. 索引规范

索引是数据库中非常重要的结构,可以加速数据的检索。但索引是要占用大量空间的,如果你的数据表里面没几条记录,就不必创建索引。比如2000条以下。

选择性很小的字段(低基数列),不要加索引。比如一些state,type,布尔判断等。因为加了也没用。

尽量让索引的内容尽量的短!比较长的子段,要使用前缀索引。比如:title varchar (64) ,可以创建前缀索引 idx_title (title(16))

合理利用索引的最左原则,合并相似的索引。比如 (a) (ab) (abc)三种索引需求,我们只需要创建abc这一个索引就ok了。

避免在索引列做计算(这将造成索引失效),比如 data_format(created_date)substring(short_name,0,6) = 'xjjdog'

不能使用%前缀模糊查询,因为无法使用索引,例如:WHERE name LIKE '%味道'

不能使用数据库端做全文检索操作。虽然它支持,也不要这么做。

索引的命名要有章可循:idx_前缀表明是普通索引,而 uk_前缀表明的是唯一索引。

3. SQL规范

建议在每个表中,添加下面三个字段。其实,SpringBoot JPA,也建议你添加上这三个字段。根据时间字段,除了审计,还能够做一些非常nice的迁移操作;version字段是高并发下的乐观锁实现,UPDATE语句可以结合version字段,避免并发操作造成的不一致情况。

  • created:记录创建时间,时间类型
  • modified:记录修改时间,时间类型
  • version:“乐观锁”的版本标记,long型,默认为0

大多数字段应该定义成not null的,并分配默认值,但是不要default null,因为数据库无法索引null值。

复杂的SQL查询语句,是绝对要避免的。我们所说的,就是慢查询。慢查询会占用大量资源,并阻塞线程,应该见谅将大SQL拆分成多条简单的SQL,减少数据的锁定时间。

另外,不要在不同数据类型的字段上进行比较,避免字段类型转换造成性能损失,这就要求我们在SQL语句中传入的参数类型,和数据库中所定义的类型是相同的。

禁止使用select *进行输出,应该选择具体的字段进行输出。除了避免无用的字段造成传输上的性能损耗,还能在一定程度上避免敏感信息的泄漏。

SQL中避免出现now()、rand()、sysdate()、current_user()等不确定结果的函数。

禁止使用order by rand()。

插入语句,不要直接使用 nsert into table values(),而应该加入具体的字段,否则无法适应数据库变更情况。在做批量插入时,一次性操作100-200条就可以,没必要把batch数量设置成上千上万。

禁止非框架类业务代码,直接调用set sql_mode或者set tx_isolation,禁止使用SELECT … FOR UPDAT,优先采用乐观锁实现。

多表关联不要超过3个,尽量拆分成简单的SQL处理。

大多数开发人员会在需要时写UNION,这往往会导致执行一个排序来消除重复。应该尽量使用UNION ALL来代替UNION。

注意OR语句的一些改善情况。比如WHERE id=1 OR id=2可以 改写为WHERE id IN(1,2)。在不同的字段,可以将OR改写为UNION ALL

4. 命名规范

数据库表和字段的命名,不要使用驼峰命名方式。比如,不能叫saleOrder,而应该叫做sale_order。因为大多数数据库,都不区分大小写,下划线命名会更安全。

这些命名,只能使用英文小写字母、数字和下划线,长度不超过17个字符。

命名应该有确切的含义。和代码规范一样,不允许使用a,b等无意义的字符串。不允许中文拼音缩写、中英文混用等。

严禁出现哥哥表和妹妹字段。

5. 安全安全安全

(1) 服务器隔离 如果你的公司有多个环境,比如dev环境,测试环境等,就要做好相应的隔离。比如,不允许在线上环境直接进行开发和测试、禁止在线上做数据库压⼒力测试。这是非常重要的,避免了无谓的数据错乱。如果条件允许,甚至可以做物理隔离,用不同的IP段进行区分。不长脑子的程序员有很多,你永远不知道他们连的是哪个环境的数据库。

(2)账户的权限 永远不要在生产上,让root账号远程可连。对不同的应用,应该分配不同的database,并建立相互隔离的账号。

账号默认开启select/insert/update/delete/execute的权限就可以。create都不能放开,用根本上杜绝程序员们删库跑路的机会。

针对安全级别高的应用,应分配读写账号。读账号去掉各种更新权限,只能做一些sql查询。账号命名方式上,可以加入_w或者_r后缀,表明它们的意图。

对于SQL的传入参数(数字,字符和混用)必须进行合法性检查,防止SQL注入。业务应该提前准备好风险SQL语句,进行集中审核,负责后果自负。

6. 性能小case

如有自增字段,请使用无符号型(unsigned)int或bigint 。优先使用更小的数据类型,比如:

  • 数字用tinyint、smallint、mediumint、int、bigint类型;
  • 日期用date、datetime类型;
  • 时间用timestamp、int类型;
  • 不使用char、varchar存储日期和时间;
  • 使用更小的数据类型,能用tinyint的就不用smallint,能用timestamp的就不用datetime类型;

不能使用tinyblob、mediumblob、blob和longblob类型字段,对于表存在大字段类型,应当考虑单独拆分。

OLTP数据库绝对要避免大事务和数据库端运算,可以考虑使用NoSQL或者大数据计算平台。

End

可以看到,我们规范里,有些禁止的东西,其实最后还是用了。比如分区表、大字段存储、GIS操作。但这是和规范不冲突的。

规范,只定义了一些常见的可能会引起严重后果的操作禁止,然后将风险的事情,交给专业的人去做,并评估、控制风险点的规模。

规范定了,要执行才行。不论是人工的review,还是工具的检测。如此,系统才能健康成长,程序员才能不加班,领导才能开上保时捷。

这时候,我汇报完毕,抬头向领导望去。他的头倚在真皮座椅后背上,已经沉沉的的睡了过去。我把外套轻轻脱下来,披在他身上,这才捧过自己的茶杯,咕咚一口喝了下去。虽然茶已经凉了,但醇香一直在嘴中缭绕。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小姐姐味道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
建议收藏 | 专业的MySQL开发规范
命名规范的对象是指数据库SCHEMA、表TABLE、索引INDEX、约束CONSTRAINTS等的命名约定
福贵
2019/10/08
1.6K0
MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》
数据库环境 dev:开发环境,开发可读写,可修改表结构。开发人员可以修改表结构,可以随意修改其中的数据但是需要保证不影响其他开发同事。 qa:测试环境,开发可读写,开发人员可以通过工具修改表结构。 sim:模拟环境,开发可读写,发起上线请求时,会先在这个环境上进行预执行,这个环境也可供部署上线演练或压力测试使用。 real:生产数据库从库(准实时同步),只读环境,不允许修改数据,不允许修改表结构,供线上问题查找,数据查询等使用。 online:线上环境,开发人员不允许直接在线上环境进行数据库操作,如果需要操
庞小明
2018/06/01
5.8K0
公司用的 MySQL 团队开发规范,太详细了,建议收藏!
数据库对象是数据库的组成部分,常见的有以下几种:表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。
用户1516716
2021/11/23
9700
MySQL数据库开发规范知识点速查
数据库设计规范 命名规范 基本设计规范 索引设计规范 字段设计规范 SQL开发规范 操作行为规范 命名规范 对象名称使用小写字母并用下划线分割 禁止使用MySQL保留关键字 见名识义,最好不超过32个
linxinzhe
2018/04/16
1.5K0
MySQL数据库开发规范知识点速查
Mysql数据库对象命名规范
数据库对象是数据库的组成部分,常见的有以下几种:表(Table )、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(Stored Procedure)、 用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。
jwangkun
2021/12/23
6.1K0
互联网MySQL开发规范
7、索引命名:非唯一索引必须以 idx_字段1_字段2命名,唯一所以必须以uniq_字段1_字段2命名,索引名称必须全部小写
用户10002156
2023/08/07
2240
互联网MySQL开发规范
开发规范(一):Mysql篇
] 10. 表字段注释,每个字段必须设置注释说明; 11. 表字段注释,状态类型的字段必须说明取值规则(比如性别sex取值规则)
程序员朱永胜
2023/08/21
3060
MySQL开发规范
索引是一把双刃剑,它可以提高查询效率但也会降低插入和更新的速度并占用磁盘空间
用户7657330
2020/08/14
8620
【笔记】Mysql 数据库操作规范
【FAQ-1-01】 库名、表名、字段名必须使⽤小写字母,并采⽤下划线分割。 a)MySQL 有配置参数 lower_case_table_names,不可动态更改,linux 系统默认为 0,即库表名以实际情况存储,⼤小写敏感。如果是 1,以⼩写存储,⼤小写不敏感。如果是 2,以实际情况存储,但以小写⽐较。 b) 如果⼤小写混合使用,可能存在 abc,Abc,ABC 等多个表共存,容易导致混乱。 c) 字段名显⽰区分⼤⼩写,但实际使用不区分,即不可以建立两个名字⼀样但大小写不一样的字段。 d) 为了统⼀规范,库名、表名、字段名使⽤⼩写字母。
redszhao
2021/08/09
1.5K0
【笔记】Mysql 数据库操作规范
MySQL使用规范手册,程序员必知必会
一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢;而在Java应用开发中数据库更是尤为重要,绝大多数情况下数据库的性能决定了程序的性能,如若前期埋下的坑越多到后期数据库就会成为整个系统的瓶颈;因此,更规范化的使用MySQL在开发中是不可或缺的。
挨踢小子部落阁
2019/10/16
8150
Mysql开发规范
命名规范的对象,是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等
用户3876103
2024/11/03
1120
从SQL质量管理体系来看SQL审核(3)
从SQL质量管理体系来看SQL审核系列包括多篇文章,将从SQL质量管理体系的角度来讨论如何设计一个优秀SQL审核引擎,欢迎订阅。
PawSQL
2024/08/20
1490
从SQL质量管理体系来看SQL审核(3)
MySQL数据库开发的 36 条军规
Innodb主键推荐使用自增列(主键建立聚簇索引,主键不应该被修改,字符串不应该做主键)
九转成圣
2024/04/10
1720
MySQL - 高效的设计MySQL库表
范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。数据库的设计范式是数据库设计所需要满足的规范。
小小工匠
2021/08/17
3.4K0
21个MySQL表设计的经验准则
作为后端开发,我们经常需要设计数据库表。整理了21个设计MySQL表的经验准则,分享给大家,大家看完一定会有帮助的。
捡田螺的小男孩
2023/02/24
1.8K0
21个MySQL表设计的经验准则
MySQL规范
列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差
Kindear
2019/05/27
1.4K0
mysql开发规范
命名规范 库名、表名、字段名必须使用小写字母,并采用下划线分割 库名、表名、字段名禁用超过32个字符。须见名知意 库名、表名、字段名禁用使 MySQL保留字 临时库、表名必须以tmp为前缀,并以日期为后缀 备份库、表必须以bak为前缀,并以日期为后缀 基础规范 使用INNODB存储引擎 表字符集使用utf8mb4 所有表都需要添加注释 单表数据量建议控制在5000W以内 不在数据库中存储图片、文件等大数据 禁止在线上做数据库压力测试 禁止从测试、开发环境直连数据库 库表设计 禁止使用分区表 拆分大字段和访问
lestat
2018/04/11
1.7K0
Mysql 军规升级版
为什么80%的码农都做不了架构师?>>> 一、基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1) 通用,无乱码风险,汉字3字节
北漂的我
2019/05/29
6280
MySQL数据库设计规范
MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理流程、数据库表设计、SQL编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。
物流IT圈
2019/07/16
2.3K0
MySQL数据库设计规范
MySQL高性能优化规范建议,速度收藏
•所有数据库对象名称必须使用小写字母并用下划线分割•所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)•数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符•临时库表必须以 tmp_为前缀并以日期为后缀,备份表必须以 bak_为前缀并以日期 (时间戳) 为后缀•所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)
用户5224393
2019/07/23
7750
相关推荐
建议收藏 | 专业的MySQL开发规范
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档