数据库结构的优化

数据库优化之结构优化 首先要了解什么事数据库的优化,那么就要列举数据库优化的几种方式。 第一个方法:选取最适用的字段属性。MySQL可以支持大数据量的存取,但是数据库中的表越小,在上面执行的查询就越快。所以可以将表中的字段宽度设置的尽可能小。 第二个方法:使用连接来代替子查询(Sub-Queries)。可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。 第三个方法:使用联合(... 阅读详情

数据库结构的优化

1、选择合适的数据类型
数据类型的选择,重点在于“合适”二字,如何确定选择的数据类型是否合适了?
1、使用可以存下你的数据的最小的数据类型。(时间类型数据:可以使用varchar类型,可以使用int类型,也可以使用时间戳类型)
2、使用简单的数据类型,int要比varchar类型在mysql处理上简单。(int类型存储时间是最好的选择)
3、尽可能的使用not null定义字段。(innodb的特性所决定,非not null的值,需要额外的在字段存储,同时也会增加IO和存储的开销)
4、尽量少用text类型,非用不可时最好考虑分表。
2、案例
案例一:int类型存储时间-时间转换
使用int来存储日期时间,利用FROM_UNIXTIME(),UNIX_TIMESTAMP()两个函数来进行转换。
创建表:

create table test(
id int auto_increment not null,
timestr int ,
primary key(id)
);

导入数据:

insert into test (timestr) values (unix_timestamp('2018-05-29 16:00:00'));

查询数据:如下图所示:

时间进行转换:

select FROM_UNIXTIME(timestr) from test;

结论:
1、unix_timestamp()函数是将日期格式的数据转换为int类型
2、FROM_UNIXTIME(timestr)函数是将int类型转换为时间格式
案例二:ip地址的存储
在我们的外部应用中,都要记录ip地址,大部分场合都是varchar(15)进行存储,就需要15个字节进行存储,但是bigint只需要8个字节进行存储,当数据量很大的时候(千万级别的数据),相差7个字节,但是不能小看这7个字节,给大家算一下。

一个字段就多这么多,那如果我们这样的字段需要上万个字段了?是需要很多的存储空间的。
使用bigint(8)来存储ip地址,利用INET_ATON(),INET_NTOA()两个函数来进行转换。

创建表:

create table sessions(
id int auto_increment not null,
ipaddress bigint,
primary key (id)
);

导入数据:

insert into sessions (ipaddress)values (inet_aton('192.168.0.1'));

转换:

select inet_ntoa(ipaddress) from sessions;  

检索:

2、数据库表的范式化优化
1、表范式化
范式化是指数据库设计的规范,目前说道范式化一般是指第三设计范式。也就是要求数据表中不存在非关键字段对任意候选关键字段的传递函数依赖则符合第三范式。

存在以下传递函数依赖关系:
(商品名称)->(分类)->(分类描述)
也就是说存在非关键字段 “分类描述”对关键字段“商品名称”的传递函数依赖。

不符合第三范式要求的表存在以下问题:
1、数据冗余:(分类,分类描述)对于每一个商品都会进行记录。
2、数据的插入异常
3、数据的更新异常
4、数据的删除异常(删除所有数据,分类和分类描述都会删除,没有所有的记录)

如何转换成符合第三范式的表(拆分表):
将原来的不符合第三范式的表拆分为3个表
商品表、分类表、分类和商品的关系表

2、反范式化
反范式化是指为了查询效率的考虑把原本符合第三范式的表“适当”的增加冗余,以达到优化查询效率的目的,反范式化是一种以空间来换取时间的操作。

如何查询订单信息?

select b.用户名,b.电话,b.地址,a.订单ID,sum(c.商品价格*c.商品数量)as 订单价格
from 订单表 as a
join 用户表 as b on a.用户ID=b.订单ID
join 订单商品表 as c on c.订单ID=b.订单ID
group by b.用户名,b.电话,b.地址,a.订单ID

对于这样的表结构,对于sum(),group by会产生临时表,增加IO量。我们怎么优化都效率不高,那我们怎么样才能让它效率高了,就需要一些字段进行冗余。

订单表中增加了冗余字段,那SQL该怎么写了?

select a.用户名,a.电话,a.地址,a.订单ID,a.订单价格 
from 订单表 as a

说明:表结构的设计直接涉及到SQL的查询效率及优化。
3、数据库表的垂直拆分
1、垂直拆分定义
所谓的垂直拆分,就是把原来一个有很多列的表拆分成多个表,这解决了表的宽度问题。
2、垂直拆分原则
通常垂直拆分可以按以下原则进行:
1、把不常用的字段表单独存放到一个表中。
2、把大字段独立存放到一个表中。
3、把经常一起使用的字段放到一起。
例子:以film表为例

在该表中,title和description这两个字段占空间比较大,况且在使用频率也比较低,因此可以将其提取出来,将上面的一个达标垂直拆分为两个表(film和film_ext):如下所示:
1、

2、

4、数据库表的水平拆分
1、为什么水平拆分
表的水平拆分是为了解决单表数据量过大的问题,水平拆分的表每一个表的结构都是完全一致的,以下面的peyment表为例来说明

desc payment;

show create table payment;

CREATE TABLE `payment` (
  `payment_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `customer_id` smallint(5) unsigned NOT NULL,
  `staff_id` tinyint(3) unsigned NOT NULL,
  `rental_id` int(11) DEFAULT NULL,
  `amount` decimal(5,2) NOT NULL,
  `payment_date` datetime NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`payment_id`),
  KEY `idx_fk_staff_id` (`staff_id`),
  KEY `idx_fk_customer_id` (`customer_id`),
  KEY `fk_payment_rental` (`rental_id`),
  KEY `inx_paydate` (`payment_date`),
  CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE,
  CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`) REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8

2、水平不拆分原因
如果单表的数据量达到上亿条,那么这时候我们尽管加了完美的索引,查询效率低,写入的效率也相应的降低。
3、如何将数据平均分为N份
通常水平拆分的方法为:
1、对customer_id进行hash运算,如果要拆分为5个表则使用mod(customer_id,5)取出0-4个值。
2、针对不动的hashid把数据存储到不同的表中。
4、水平拆分面临的挑战
1、夸分区表进行数据查询
前端业务统计:
业务上给不同的用户返回不同的业务信息,对分区表没有大的挑战。
2、统计及后台报表操作
但是对后台进行报表统计时,数据量比较大,后台统计时效性比较低,后台就用汇总表,将前后台的表拆分开。

4、关系型数据库结构优化指南 本博客详细介绍了关系型数据库结构优化的实用指南,包括数据库列、表和关系的微调方法。文章涵盖列名检查、列结构优化、解决多部分列和多值列问题、表结构优化以及建立稳固的表间关系等内容,旨在帮助读者提高数据库性能和数据完整性,为高效使用SQL和准确获取数据打下坚实基础。 阅读详情

相关推荐

MySQL数据库结构优化最佳实践

详细介绍数据库结构设计、范式和反范式设计、物理设计等等 目录: 一、结构优化概述 二、结构设计 三、需求分析及逻辑设计 四、需求分析及逻辑设计—反范式化设计 五、范式化设计和反范式化设计优缺点 六、物理设计概述 七、物理设计—数据类型的选择 八、物理设计—如何存储日期类型 九、物理设计—总结

数据库优化----结构优化

前面介绍了索引,其实最重要的是数据库表结构对数据库的影响,良好的数据库逻辑设计和物理设计是数据库获取高性能的基础,数据库结构优化的目的:1、减少数据冗余,数据冗余是指相同的数据在多个地方存在,表中的某个列可以在其他某个列中获取到,2、尽量避免数据维护中出现更新、插入和删除异常,插入异常指的是,3、节约数据库存储空间。 一.首先我们选择合适的数据类型 数据类型的选择,重点在于“合适”二字,如何确定...

weixin_46106066的博客 2059

MySQL数据库性能优化之表结构优化

很多人都将<数据库设计范式>作为数据库表结构设计“圣经”,认为只要按照这个范式需求设计,能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求。殊不知,在N年前被奉为“圣经”的数据库设计3范式早已经不完全适用了。这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用。   这是 MySQL数据库性能优化专题 系列的第二篇文章:MySQL 数据库性能优化之表结构优化   系列的第一篇文章:MySQL 数据库性能优化之缓存参数优化   由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也是说,如果

数据库优化,看这篇就够了!

以下是我结合平常自己学习收集的一些资料,以系统、全面的方式整理成了这篇文章,也希望能让一些有需要的同行在工作上、成长上提供一定的帮助。

m0_60456028的博客 2636

使用STM32微控制器实现光电传感器的接口和数据处理

本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案,包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤,并给出相应的代码示例。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案,包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤,并给出相应的代码示例。在光电传感器的接口和数据处理的实现过程中,要关注系统的性能。在使用STM32微控制器实现光电传感器的接口和数据处理之前,需要设计一个合适的硬件平台。

weixin_66608063的博客 3204

攻防世界GFSJ1184_welcome_CAT_CTF

由于它是 PIE 可执行文件,程序加载地址会随机化,这导致你在 GDB 调试时需要处理地址偏移(如 0x246d 变成 0x55555540246d)。:client 程序通过网络连接(get_nc() 和 get_flag(nc))与 server 通信,server 监听在端口 8888。:client 依赖外部共享库(如 libstdc++.so),因此运行时需要这些库存在系统中。程序就是wasd移动,走到不同标记(* $ @ )下方,输入j回车,会有不同反应。两个文件client和server。

拥抱AI的老粽子 1265

数据结构的内存管理和优化

作者:禅与计算机程序设计艺术 数据结构简介 数据结构是计算机中最基础、最重要的分支之一。数据结构定义了数据的存储结构、关系、操作方法等组织形式。它使得数据可以高效地被处理、存储、检索、传输、检索、修改等。常见的数据结构如数组、链表、栈、队列、树、图、散列、集合等。

AI天才研究院 3219

[Unity实战]热更新如何预防过度裁剪

假设你现在有一个游戏客户端,客户端只打包了入口场景,游戏场景都存放在了AB包。

u012587406的博客 1606

看完还不会数据库优化,你来找我!

当有人问你如何对数据库进行优化时,很多人第一反应想到的就是SQL优化,如何创建索引,如何改写SQL。他们把数据库优化与SQL优化划上了等号。当然这不能算是完全错误的回答,只不过思考的角度稍微片面了些,太“程序员思维”化了,没有站在更高层次来回答。那今天我们就将视角拔高,站在架构的角度来聊聊这一问题,数据库优化可以从哪些维度入手? 正如上图所示,数据库优化可以从架构优化,硬件优化,DB优化,SQL优化四个维度入手,此上而下,位置越靠前优化越明显,对数据库的性能提升越高。​我们常说的SQL优化反而是对性能提高

飘渺Jam的博客 3330

通过WorkVisual连接KUKA机器人的具体方法

通过WorkVisual连接KUKA机器人的具体方法

Robot_PLC_HMI_Automation 6848

[QMT量化交易小白入门]-七、可转债双低策略Python代码详解与实战

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 3894

MySQL数据库结构优化

数据库结构优化 1. 介绍 数据库结构优化的目的是为了 减少数据冗余 尽量避免数据维护中出现更新,插入和删除异常. 节约数据存储空间 提高查询效率 前三点可以通过范式来分表,而最后一点则需要反范式化(或索引等其他手段)来做到。 即使不了解范式的人,也能看出来反范式和范式是一对反义词,所以再实际情况下,应该根据情况进行判断. 2. 数据库结构设计 2.1 需求分析 几乎80%的问题都因为需求分...

过道 1715

在hyper-v管理器中修改WSL虚拟交换机后,打开wsl闪退

此次是因为修改了WSL虚拟交换机造成的wsl打不开或闪退,还有一种可能是关闭了hyper-v造成了wsl。

DN金猿的博客 1173

数据库结构优化

数据库结构优化的目的是为了 减少数据冗余 尽量避免数据维护中出现更新,插入和删除异常. 节约数据存储空间 提高查询效率 数据库设计范式 第一范式 数据库表中的所有字段都自由单一属性 单一属性的列是由基本的数据类型锁构成的 设计出来的表都是简单的二维表 综上: 几乎只要能在当今数据库中建立起来的表都是第一范式,但是很可能有很大的优化空间 我们有一个学生选课表, 太过于冗余,明显可以拆成:...

xxy55895的博客 365

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3661

一文读懂OpenClaw:核心组件与工作原理深度解析

Agent核心:负责理解意图、规划任务、协调执行消息系统:统一的消息格式,实现组件间解耦工具注册表:可扩展的工具系统,支持自定义工具模型适配层:多模型支持,统一API接口安全机制:沙箱隔离、权限确认、操作审计性能优化:并行执行、智能缓存、增量更新理解这些核心组件和工作原理,将帮助你更好地使用OpenClaw,也为后续开发自定义扩展打下坚实基础。在下一篇文章中,我们将详细介绍OpenClaw的界面操作,包括命令行与交互模式的各种技巧。

gaoxiang_120的专栏 833

mysql数据库结构优化_MySQL数据库结构如何优化

1.数据库结构优化数据库结构优化的目的:减少数据冗余尽量避免数据维护中出现更新,插入和删除异常插入异常:如果表中的某个实体随着另一个实体而存在更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新删除异常:如果删除表中的某一实体则会导致其他实体的消失节约数据存储空间提高查询效率2.数据库结构设计的步骤需求分析:全面了解产品设计的存储需求、数据处理需求、数据的安全性和完整性逻辑设计:设计数...

weixin_31880383的博客 422

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

MySQL数据库结构如何优化

1.数据库结构优化 数据库结构优化的目的:     减少数据冗余     尽量避免数据维护中出现更新,插入和删除异常     插入异常:如果表中的某个实体随着另一个实体而存在     更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新     删除异常:如果删除表中的某一实体则会导致其他实体的消失     节约数据存储空间     提高查询效率 2.数据库结构设计的...

智者千虑,必有一失;愚者千虑,必有一得。 374

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

总结之MySQL数据库结构优化

MySQL两种常用存储引擎分析 MyISAM MySQL5.5之前版本默认存储引擎 其中系统表、临时表(在排序、分组等操作中,当数量超过一定的大小之后,由查询优化器建立的临时表)使用MyISAM 特性:表级锁、并发性不行、可以表损坏修复、支持全文索引、支持数据压缩 限制:版本<MySQL5.0时默认表大小为4G,版本>MySQL5.0是默认表大小>256TB 适用场景: 非事务型...

IManiy的博客 337

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MYSQL 数据库结构优化

数据库结构优化 优化数据大小 使表占用尽量少的磁盘空间。减少磁盘I/O次数及读取数据量是提升性能的基础原则。表越小,数据读写处理时则需要更少的内存,同时,小表的索引占用也相对小,索引处理也更加快速。 MySQL支持不同类型的存储引擎和行格式,针对不同类型,业务需求的表应该设置合适的存储引擎及索引方法。表设置建议如下: 表列 为列选择最合适(通常最小)的数据类型。MySQL 具有许多不...

weixin_30551963的博客 108

MySQL性能优化:优化思路、查询优化、索引优化、存储优化、数据库结构优化、数据库结构优化

MySQL性能优化 1 优化介绍 ​在进行优化讲解之前,先请大家记住不要听信你看到的关于优化的“绝对真理”,而应该是在实际的业务场景下通过测试来验证你关于执行计划以及响应时间的假设。给大家提供一些优化方面的方向和思路,而具体业务场景的不同,使用的MySQL服务版本不同,都会使得优化方案的制定也不同。 1.1 MySQL介绍 ​MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。可以看到Google,Facebook,Twitter,百度,新浪,腾讯,淘宝,网易,

weixin_41942838的博客 2万+

mysql数据库结构优化_mysql数据库结构优化(笔记)

主要包括数据库结构方面优化的介绍:数据库范式设计,物理设计介绍,数据结构类型数据库结构优化介绍良好的数据库逻辑设计和物理设计是数据库获得高性能的基础数据库结构优化的目的减少冗余尽量避免数据库中出现更新、插入和删除异常插入异常:如果表中的某个实体随着另一个实体而存在更新异常:如果更新表中的某个实体的单独属性时,需要对多行进行更新删除异常:如果删除表中的某一实体则会导致其他实体的消失节约存储空间提高查...

weixin_42311349的博客 98

MySQL 总结 数据库结构优化

影响MYSQL 性能的因素有: 服务器硬件 , 操作 系统, MySQL 服务器配置。 影响最大的是 数据库结构, 良好的数据库物理设计与逻辑设计 是数据库高性能的基础。 数据库结构 优化的目的: 1.减少数据冗余。 2.尽量避免数据维护中出现更新, 插入和删除异常。 插入异常:表中某个实体随另一个实体而存在 更新异常:更新表某个实体的单独属性,需要对...

zhzsdiligence的博客 231
上一篇: 数据库优化--索引
下一篇: 数据库锁,事务特性,脏读,幻读,不可重复度,隔离级别,分布式事务,本地事务的介绍
小亮彡
博客等级 码龄7年 6粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值