数据库表设计及优化初步——项目中的数据库表究竟怎么设计?如何提高查询效率?

news2024/11/20 9:48:38

在这里插入图片描述

前言

我们都知道数据库设计有以下三大范式,但实际应用中真的是按照这三大范式来设计吗?

本篇博客尝试阐述项目中数据库表的设计,以及查询优化的方法。

第一范式:

原子,列信息不可再分;

第二范式:

行是唯一的,有主键

代理主键:自增长的整数序列

第三范式:

其他列与主键都相关联,其他列之间无关联

目录

  • 前言
  • 引出
  • 一、表的字段和查询优化问题
    • 问题的引入
    • 问题的分析
  • 二、表的拆分和冗余字段
    • 大表拆小表
    • 冗余设计
  • 三、实际应用中的数据库设计规范
  • 总结

引出


1.表的列为什么不能太多?行锁
2.查询优化:大表拆小表、冗余字段存储;
3.实际中数据库设计规范:Innodb存储引擎,utf8mb4字符集. . .

一、表的字段和查询优化问题

问题的引入

1、一张表的列为什么不能太多?
2、开发中如何进行查询优化?

问题的分析

  1. 当一张表的字段太多,我们在更新列的时候,都会对表加一个行锁,我们的列越多,肯定加大我们我们锁行的概率。当同时更新一行中的不同列时,就会出现锁,导致mysql DML操作出现延迟等待。

  2. 数据冗余,浪费我们的IO的读写,例如我们的程序取数据的时候,直接select * from 操作的话,就会把所有列的数据取出来,这样比较浪费IO读写。

  3. 我们数据库中的日志的最小单元是一行记录,每次update记录日志时,都会保存每列的记录,会产生大量的日志

  4. 数据库冗余设计、大表拆小表、索引等。

二、表的拆分和冗余字段

大表拆小表

关于查询优化,除了从索引等层面回答外,也可以从数据库设计层面根本上提升查询性能,比如大表拆小表、冗余字段存储等。

比如:在我们设计数据库表的时候,面临表字段过多的情况下,我们需要充分考虑业务上的某些需求,将一些不常用的字段和常用的字段分离开来,这样能够让查询常用字段的时候速度得到一定的提升;

做到冷热数据分离,减小表的宽度,带来哪些好处?

  • Mysql限制每个表最多存储4096列,并且每一行数据的大小不能超过65535字节;
  • 减少磁盘IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO)
  • 更有效的利用缓存,避免读入无用的冷数据
  • 经常一起使用的列放到一个表中,可以避免更多的关联操作

冗余设计

适当的冗余,增加常用列、列的计算结果

数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。

满足范式的表一定是规范化的表,但不一定是最佳的设计。很多情况下会为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

比如我们有一个product表,

产品名称单价库存量总价值
华为手机19991019990

这个表是不满足第三范式的,因为“总价值”可以由“单价”乘以“数量”得到,说明“总价值”是冗余字段。但是,增加“总价值”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。合理的冗余可以分散数据量大的表的并发压力,也可以加快特殊查询的速度。冗余字段也可以有效减少数据库表的连接,提高效率。

举例:这里有一个企业表:

企业ID企业名称企业注册地
100东方物流上海

合同表:

合同编号合同名称签订企业(外键)企业名称
WLHT101配实合同100东方物流

上例中的合同表的“企业名称”就是冗余存储, 查询合同所属企业时候可以有效减少数据库表连接查询,提高查询效率。

三、实际应用中的数据库设计规范

(1)、遵循三大范式;允许合理的冗余设计

(2)、所有表必须使用Innodb存储引擎

没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5.5之前默认使用Myisam,5.6以后默认的为Innodb)Innodb 支持事务(redo log)日志,支持行级锁,更好的恢复性,高并发下性能更好

(3)、库表字段名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)

(4)、所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)

(5)、数据库和表的字符集统一使用UTF8

兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储emoji表情的需要,字符集需要采用utf8mb4字符集

(6)、所有表和字段都需要添加注释

  1. 使用comment从句添加表和列的备注
  2. 从一开始就进行数据字典的维护

(7)、尽量控制单表数据量的大小,建议控制在500万以内

  1. 500万并不是Mysql数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题
  2. 可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小

(8)、禁止在数据库中存储图片,文件等大的二进制数据

通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机IO操作,文件很大时,IO操作很耗时通常存储于文件服务器,数据库只存储文件地址信息

(9)、优先选择符合存储需要的最小的数据类型

原因是:列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多,索引的性能也就越差

(10)、 避免使用TEXT、BLOB数据类型;最常见的TEXT类型可以存储64k的数据

  1. 建议:把BLOB或是TEXT列分离到单独的扩展表中。

  2. Mysql内存临时表不支持TEXT、BLOB这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行。而且对于这种数据,Mysql还是要进行二次查询,会使sql性能变得很差。

  3. 但也不是说一定不能使用这样的数据类型,如果一定要使用,建议把BLOB或是TEXT列分离到单独的扩展表中,查询时一定不要使用select *, 而只需要取出必要的列,不需要TEXT列的数据时不要对该列进行查询。

  4. 并且TEXT或BLOB类型只能使用前缀索引,因为MySQL对索引字段长度是有限制的,所以TEXT类型只能使用前缀索引,并且TEXT列上是不能有默认值的。

  5. 前缀索引:MySQL是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。如果不指定前缀索引,那么索引就是整个字符串。

  6. 例子:

    alter table User add index index1(email); 创建的索引就是将email整个字符串作为索引

    alter table User add index index2(email(6)); 只取email字符串的前6个字节作为索引。


总结

1.表的列为什么不能太多?行锁
2.查询优化:大表拆小表、冗余字段存储;
3.实际中数据库设计规范:Innodb存储引擎,utf8mb4字符集. . .

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

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

相关文章

培训机构招生电子传单制作教程:突出核心竞争力的方法

随着科技的不断发展,现在的招生宣传也变得越来越电子化。其中,电子传单就是一种非常有效的宣传方式。下面就让我们来学习如何制作具有吸引力的培训机构招生电子传单。 首先,我们需要进入乔拓云后台,并登录。在登录后,我…

Python武器库开发-基础篇(四)

基础篇(四) Open 文件 Python open() 方法用于打开一个文件,并返回文件对象。 在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。 注意:使用 open() 方法一定要保证关闭文件对象,即…

Simple RPC - 02 通用高性能序列化和反序列化设计与实现

文章目录 概述设计实现通用的序列化接口通用的序列化实现【推荐】 vs 专用的序列化实现专用序列化接口定义序列化实现 概述 网络传输和序列化这两部分的功能相对来说是非常通用并且独立的,在设计的时候,只要能做到比较好的抽象,这两部的实现…

RHCE---shell 基本知识

文章目录 目录 文章目录 前言 一.shell 概述 如何编写shell脚本 脚本开头 脚本内容 执行脚本 bash shell 基本功能 echo打印命令 printf 命令 history历史命令 命令别名 总结 前言 在UNIX和类UNIX操作系统中,Shell是一个非常重要的组件,为用户提供…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作,向服务器发送请求以及接收服务器的响应数 据的一类元件,其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下: 步骤一:添加线程组 右击测试计划——添加——线程&#x…

大数据学习(13)-join优化详解

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…

工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料

工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料 文章目录 工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料一、前言二、Profinet了解及资料收集1. 资料2. PROFINET到底是什么?3. 网络模型4. 应用场景 三、接下来 一、前言 …

最详细的Keycloak教程(建议收藏):Keycloak实现手机号、验证码登陆——(二)Keycloak与SpringBoot的集成

上一篇已经介绍了keycloak的下载与使用: Keycloak的下载与使用 本文章和大家分享keycloak怎么去集成springboot项目,以及怎么去做接口权限的校验。 PS:根据红帽的公告,目前在springboot 3.x版本已经不支持keycloak适配器,所以本章…

44岁的「老板」想变年轻

作者 | 辰纹 来源 | 洞见新研社 从村办集体企业余杭县红星五金厂起家,到生产贴牌油烟机,再到注册“老板”商标,改制有限公司,老板电器已经走过了44个春秋。 在这44年中,老板电器是首家登陆资本市场的高端厨电企业&am…

Java总结的question

Java 数据类型 Q1:基本类型和包装类型的区别? 用途:在对象属性中一般用包装类型,包装类型可用于泛型,基本类型不可以存储方式:包装类型一般放在堆,基本数据类型的局部变量一般放在栈中的局部变量表&…

页表置换算法之最佳置换算法(OPT),先进先出置换算法(FIFO),最近最久未使用置换算法(LRU),时钟置换算法(CLOCK)

请求分页存储管理与基本分页存储管理的主要区别: 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。页…

22-数据结构-内部排序-选择排序

简介:每一趟选择最小或最大的一个,排在前面或后面。主要右简单选择排序和堆排序 一、简单选择排序 1.1简介: 每趟选择最小的,放在前面,一次类推,代码思想:两个循环,外循环是趟数&a…

IDEA提高工作效率的实用技巧

IDEA是一款备受开发者喜爱的集成开发环境,它提供了许多实用的功能,可以帮助我们更快速、更高效地编写代码。本文将介绍一些IDEA的使用技巧提高工作效率的实用技巧。 验证正则表达式 要验证编写的正则表达式是否正确,只需将光标放在要检查的…

【单片机毕业设计】【hj-006-6】天然气、有害混合气体检测 | 空气质量检测 | 有害气体检测

一、基本介绍 项目名: 基于单片机的天然气、有害混合气体检测系统设计 基于单片机的空气质量检测系统设计 基于单片机的 有害气体检测系统设计 项目编号:mcuclub-hj-006-6 单片机类型:STC89C52 具体功能: 1、通过MQ-5检测天然气…

C语言——二周目——输入输出辨析

一、对输入输出的理解 1.明确输入的意义 以往的输入为默认形式(标准输入流——stdin——键盘)。但是输入的形式不止此一种。可以从键盘上敲出输入的数据,同时也可以将文件中、某个字符串甚至结构体的数据作为输入内容进行输入。 输入&#x…

Spring boot 集成 xxl-job

文章目录 xxl-job 简介引入xxl-job依赖配置xxl-job config添加properties文件配置BEAN模式(方法形式)步骤一:执行器项目中,开发Job方法:步骤二:调度中心,新建调度任务 xxl-job 简介 官网:https:…

【虹科干货】Redis Enterprise vs ElastiCache——如何选择缓存解决方案?

使用Redis 或 Amazon ElastiCache 来作为缓存加速已经是业界主流的解决方案,二者各有什么优势?又有哪些区别呢? 文况速览: - Redis 是什么? - Redis Enterprise 是什么? - Amazon ElastiCache 是什么&…

阿里云高庆瑞:高弹性、高可用、低成本的云上资源管理最佳实践

云布道师 为了更好地帮助用户在借助 DevOps 工具缩短开发周期、提升业务效率的同时,也能让业务保持稳定、安全、可靠,且低成本地持续运营,阿里云弹性计算团队独家出品的【弹性计算技术公开课_CloudOps 云上运维季】正式启动。阿里云弹性计算团…

提升服装门店管理效率与顾客体验的RFID智慧门店解决方案

随着科技的不断进步,传统的服装门店在管理过程中面临着一些瓶颈和挑战,条码管理费时费力,服装查找耗时长,库存盘点不准确,销售管理不科学,顾客体验性较差等问题已经成为制约门店发展的难题,为了…

小程序之实例会议OA的首页 (3)

⭐⭐ 小程序专栏:小程序开发专栏 ⭐⭐ 个人主页:个人主页 目录 ​编辑 一.前言 二.flex弹性布局 flex属性 2.1 display: flex 弹性布局属性 2.2 flex-direction属性 2.3 flex-wrap属性 2.4 flex-flow属性 2.5 justify-content属性 三.首页轮播…