整理实际工作中MySQL数据库设计开发规范-实用基础

60 篇文章 0 订阅
4 篇文章 0 订阅
本文强调了在数据库设计和SQL查询中应避免的不良习惯,如全字段选择、使用保留字、不成熟的分区表等,并提供了诸如使用UTF8字符集、主键设置、优化查询方式等建议,以提升数据库性能和安全性。
摘要由CSDN通过智能技术生成

禁止项

1禁止使用select * 等查询

当查询所有字段(select *)会导致下列问题
1. 增加网络带宽消耗
2. Select *必然会导致回表查询/返回数据,使覆盖所以失效
3. 如果表结构有修改比如增加多列,返回多余数据是比较危险的

2禁止库名、表名、字段名使用MySQL保留字

当库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号引用属性名称,这将使SQL语句书写、SHELL脚本中变量的转义等变得非常复杂。

3禁止使用分区表

Mysql分区表技术还是不是很成熟,而且对分区键有严格要求,分区表变大后对于表备份恢复都有很大困难,建议在业务端使用sharding技术。

4禁止在数据库中存储明文密码

如果需要存储MySQL密码可以用MySQL内置函数password()对明文密码进行MD5进行密。

5SQL中禁止出现now()rand()sysdate()current_user()等不确定结果的函数。

建议不确定的时间在程序层取出时间,语句级复制场景下 , 引起主从数据不一致 ;
不确定值的函数 , 产生的 SQL 语句无法利用。

6禁止使用VARBINARYBLOB存储图片、文件等,使用VARCHAR(N)N尽量可能小

7禁止在列上进行运算

在列上运算 将导致Mysql索引失效而进行全表扫描。

规范项:

1建表字符集使用UTF8

UTF8统一而且通用,不会出现转码出现乱码风险

2表必须有主键,推荐使用UNSIGNED自增列作为主键

表没有主键,INNODB会默认设置隐藏的主键列;没有主键的表在定位数据行时效率会非常低而且降低基于行复制的效率。
在建表时务必定义一个自增列 做主键(与业务逻辑无关,而应用程序的数据如果有唯一的候选列可以做成唯一键),再次重申INNODB存储引擎中每张表一定要有一个于业务无关的 自增列做主键

建议项:

1、建议慎重使用前缀匹配的模糊查询

前缀匹配会导致直接全表扫描或全索引扫描,性能最差,无任何扩展,基本不可接受。

2、建议所有字段均定义为NOT NULL,设置default值。

定义为Not Null原因如下:
1. MySQL数据库中每个为NULL的列都需要额外的1个字节进行存储,浪费空间资源。
2. B树索引时不会存储NULL值,如果索引字段可以为NULL,索引效率会下降。

3、建议查询中避免隐式转换

MySQL中如果查询字段与表定义字段不同则会发生隐式转换,从而无法用到索引导致查询效率低下。

4、建议不要在MySQL数据库中存放业务逻辑。

数据库是有状态的服务,变更复杂而且速度慢,如果把业务逻辑放到数据库中,将会限制业务的快速发展。
建议把业务逻辑提前,放到前端或中间逻辑 层,而把数据库作为存储层,实现逻辑与存储的分离。

5、建议不要使用子查询

对于子查询,mysql会对子查询结果返回给外部表,并对外部表进行全表扫描

6、建议将大字段、访问频率低的字段拆分到单独的表中存储,分离冷热数据

当我们的表中存在类似于 TEXT 或者是大的 VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该将其拆分 到另外的独立表中,以减少常用数据所占用的存储空间。
这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,也能大大提高内存中的缓存命中率。

7、建议用in() /union替换or,并注意in的个数(个数多少依照具体情况而定)

8 、建议尽量不使用 mysql 存储过程、触发器、函数等(依照具体情况而定)
容易将业务逻辑和DB耦合在一起,并且对于目前数据量存储过程、触发器、函数等没有任何优势(存储过程、函数对大数据量的处理和复杂业务逻辑很有 优势),而且mysql存储过程还有一定BUG。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵然间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值