积攒十五年的MySQL数据库设计经验,拿走不谢

yumo6663个月前 (03-20)技术文章29

前言

关系型数据库是当前广泛应用的数据库类型,关系数据库设计是对数据进行组织化和结构化的过程,核心问题是关系模型的设计。对于数据库规模较小的情况,我们可以比较轻松地处理数据库中的表结构。然而,随着项目规模的不断增长,相应的数据库也变得更加复杂,关系模型表结构更为庞杂,这时我们往往会发现我们写出来的SQL语句是很笨拙并且效率低下的。表结构设计不完善,导致业务需求和可扩性非常差。因此,就有必要学习和掌握数据库的规范化流程,以指导我们更好的设计数据库的表结构,减少冗余的数据,借此可以提高数据库的存储效率,数据完整性和可扩展性。下面分别从表设计规范和索引设计规范两个方面给大家分享一下关系数据库该如何设计。

表设计规范

1. 表存储引擎建议使用InnoDB。

2. 表字符集选择UTF8 ,如果需要存储emoj表情,需要使用UTF8mb4。

3. 设计表的时候需要给表和每个字段添加中文注释。方便大家在查看表时,知道表是干什么用的,以及每个字段都是什么含义。

4. 尽量少使用存储过程、视图、触发器、事件等。尽量简单使用数据库,让他做自己擅长的事情,把一些复杂的运算放在业务层来实现。

5. 单表存储数据量控制在千万级以下,预估表数据大小,提前做好分区规划。

6. 建表时,最好建一个唯一标识ID字段,用来唯一的区分一行数据。

7. 建表时,表字段尽量少而精,控制在20~50个字段之间,纯int不超50,纯char不超20。

8. 建表时,尽量将字段设置为非空,并设置默认值。

9. 建表时,字段需为NULL时,需设置字段默认值,默认值不为NULL。

10. 建表时,如果字段等价于外键,应在该字段加索引。

11. 建表时,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比。

12. 建表时,尽量避免使用Text/Blob大字段类型,若在必须使用且读取频率低的情况下,则将该字段拆分到一个单独的表中,让我们在读取表其它字段的时候大大的降低IO资源消耗,从而使性能得到较大的提升。

13. 变长字符串尽量使用VARCHAR。

14. 不在数据库中存储图片、文件。将这些大文件存储交给文件系统来实现,数据库只保存文件的映射关系即可。

索引设计规范

1. 每张表必须有一个唯一主键。因为Innodb存储引擎是基于主键结构来组织数据的,如果在创建表时没有显示的指定主键,lnnodb存储引擎自己会按照如下方式选择或者创建主键。查看表中是否有非空的唯一索引,如果有,则该字段列即为主键。如果没有,会自动创建一个6字节大小的主键。

2. 关联另外一张表的主键的字段需要建立索引。

比如:账号设备表t_account_device中的字段n_account_id 关联 账号表t_account的n_id字段,则n_account_id字段需要创建索引,以加速关联查询时的查找速度,提高查询性能。

3. 避免在唯一性太差的字段上建立索引。比如:性别字段、状态字段、类型字段等。因为这种索引字段中每个值都包含大量的数据,那么存储引擎在根据索引访问数据的时候会带来大量的随机IO,甚至有些时候还会带来大量的重复IO。

4. 需要在频繁作为条件查询且唯一性较高的字段上创建索引。提高数据查询检索的效率最有效的办法就是减少需要访问的数据量,而通过给频繁作为查询条件的字段创建索引,正是减少查询IO量的最有效办法。另外选择唯一性较高的字段,可以使访问的数据量很少,查询效率更高。

5. 避免在更新非常频繁的字段上创建索引。因为索引中的字段被更新的时候,不仅仅需要更新表中的数据,同时还要更新索引数据,以确保索引信息是准确的。这会导致IO 访问量的较大增加,不仅仅影响更新的响应时间,还会影响整个存储系统的资源消耗,加大整个存储系统的负载。

6. 避免在不会出现在条件查询中的字段上创建索引。这样不仅不会加快查询速度,提高查询效率,还会造成在插入或者更新表数据时,性能的减慢,要创建合理必须的索引。

7. BLOB 和TEXT 类型的字段列只能创建前缀索引。这两种类型存储的数据值可能都比较大,而INNODB的索引会限制单独Key的最大长度为767字节,超过这个长度必须建立小于等于767字节的前缀索引。

8. 需要建立组合索引时,把唯一性高的字段放在索引的前面。这样能够更加有效的过滤数据。

上一篇:SQL优化这十条,面试的时候你都答对了吗?

相关文章

鸿博档案:档案数字化基本流程是什么

一、术语和定义1、数字化:用计算机技术将模拟信号转换为数字信号的处理过程。2、纸质档案数字化:采用扫描仪或数码相机等数码设备对纸质档案进行数字加工,将其转化为存储在磁带、磁盘、光盘等载体上并能被计算机...

DeepSeek+dify知识库,查询数据库的两种方式(api+直连)

自从发了 DeepSeek+dify 本地知识库:真的太香了这篇以后,一直有小伙伴介绍在问我,怎么让在个ai应用客户端直接连接数据库查询。dify官方没有现成的组件可以直接用。当时我想的是两种方式,一...

flowable入门-创建第一个flowable流程

一、flowable定义flowable 是一个使用Java编写的轻量级业务流程引擎。基于BPMN2.0协议,实现对流程的创建、查询、流转、报结等操作的管理。二、创建一个flowable流程创建一个f...

建立属于你的职业数据库,做一个职场“有心人”

世界上有成千上万种职业,虽然做的事情大相径庭,但有一些职业习惯是通用的。如果从刚进入职场就养成这些习惯,坚持几年后,对你的职业生涯大有裨益。这里主要推荐一个非常值得建立的职业习惯:建立属于自己的职业档...

使用Enterprise Architect设计数据库

EA简介Enterprise Architect(EA)是由Sparx Systems开发的一款综合建模和设计工具,广泛应用于软件开发、系统工程和业务流程建模。以 下是Enterprise Archi...