【MySQL】优化方向+表连接

目录

数据库表连接

表的关系与外键

数据库设计

规范化

反规范化

事务一致性

表优化

索引优化

表结构优化

查询优化


数据库表连接

表的关系与外键

表之间的关系

常见表关系总结

  • 一对一关系:每一条记录在表A中对应表B的唯一一条记录,反之也是(例如一个用户和一个用户的详细信息表是一一对应的)
  • 一对多关系:表A中的一条记录可以关联到表B中的多条记录,而表B中的每条记录只关联到A中的一条记录(例如部门和员工表,一个部分可以有多个员工,而一个员工只可以属于一个部门)
  • 多对多的关系:表A中的多条记录可以关联到表B中的多条记录(例如学生和课程的关系,一个学生可以选修多门课,一门课也可以有多名学生选修)

例如A\B\C表中,A查看C表

  • 如果A表和C表之间有外键关系,那么就可以通过A表的外键直接查询到C表的数据
  • 如果A表和C表之间没有直接关系,但可能通过B表间接关联,这个时候就要通过JOIN来实现多表查询

外键

外键是用来在两个表之间创建关联关系的关键。例如如果A表的某列是B表的外键,那么每个表A的记录在这列中的存储值,必须是表B中的有效记录。这样就可以防止出现孤立的记录,也就是一个表中有数据,但是另一个表中找不到对应的数据。

例如三张表通过外键建立关系

  • A表:员工表,其中存储着员工的ID(主键)、姓名、部门
  • B表:部门表,存储着各个部门的信息,id(主键,部门的编号)、name(部门名称)
  • C表:公司表,公司ID、公司名称(name)、公司地点
  • 假设
    • 每个员工都属于一个部门,A表中部门与B中的部门相关联
    • 每个部门又属于一个公司

A想要查询C中的数据

  • 此时表A和表C之间没有直接关系,但是可以通过B表对其进行关联
    • 表A通过部门ID找到表B
    • 表B可以通过公司ID找到关联表C
  • 查询操作
    • 使用JOIN实现,先将AB表连接起来,然后将BC连将起来,这样A就可以通过B找到C了
SELECT A.name AS employee_name, C.name AS company_name
FROM A
JOIN B ON A.department_id = B.id
JOIN C ON B.company_id = C.id;

JOIN操作

JOIN是SQL中的一个关键字,主要就是用来将多个表的数据根据某种关系连接在一起,从而进行查询。

INNER JOIN(内连接)

返回两个表中符合条件的匹配记录,也就是只返回两个表中匹配到的记录。如果某行在其中一个表中没有对应的匹配就来,那么它就不会出现在最终结果中。

LEFT JOIN(左连接)

也就是返回左表中的所有记录,即使右表中没有匹配的记录。如果右表中没有对应的匹配记录,则会返回NULL。

当需要保留左表中的全部记录的时候,无论右表是否有匹配记录,使用左连接

RIGHT JOIN(右连接)

返回右表中的所有记录,即使左表中没有匹配的记录。如果左表中没有找到对应的匹配记录,那么就会返回NULL。应用在需要保留右表中的所有记录,无论左表是否有匹配记录的时候。

FULL JOIN(全连接)

返回两个表中的所有记录,如果某行在其中一个表中没有匹配记录,就会返回NULL。适用于希望获取两个表的所有记录,无论两者是否存在匹配关系。

交叉连接(CROSS JOIN)

返回两个表的笛卡尔积,也就是返回左表每一行和右表每一行的组合,不需要关联条件,通常返回的结果集数量非常庞大,除非表非常小。

数据库设计

规范化

规范化主要通过其应用范式来进行设计。规范化是一种设计数据库表的结构,目的就是减少数据冗余、消除数据不一致性的,同时通过分解表来确保数据的依赖性。

  • 第一范式:表中的每一列都只包含不可再分的原子值
  • 第二范式:满足第一范式的基础上,并且每一个非主键字段完全依赖于主键,而不是主键的一部分
  • 第三范式:满足第二范式的基础上,非主键字段不可以依赖于其他字段的主键

理解三大范式

  • 第一范式每一列放置的信息都是唯一的。也就是说假如有一个家庭联系人名单,如果某一列中同时放置了其电话号码和手机号码,那么就不符合第一范式的情况。应该为设置两列,分别放置手机和电话号码,才满足其第一范式
  • 第二范式:一个表应该只有一个主键。假设班级学生表,如果学号和班级编号共同作为主键,但是学生姓名只依赖于学号,班级名称缺是依赖于班级编号,那么该种情况就不符合第二范式。如果学生姓名和班级名称全部都依赖于学号,那么就是符合第二范式。
  • 第三范式:假设有一个商品表,其中有商品名称、价格以及种类。商品价格和名称都应该直接依赖于商品的唯一标识(例如商品ID),而不是通过商品的种类去决定商品的价格。如果商品表中依赖于种类,而不是直接依赖于其ID,那么就是不符合第三范式。如果商品价格和种类都是直接依赖商品ID那么就符合第三范式。

规范设计订单处理

通过设计Orders表没有冗余的存储客户和商品的详细信息,而是通过customer_id和product_id引入Customers和Products表

反规范化

为了提高查询效率,故意将部分数据冗余存储,从而减少JOIN操作带来的开销。反序列化也就是通过在表中重复一些信息,避免频繁的跨表查询,从而加快查询速度,但是可能会导致数据不一致的情况。

订单查询实践

例如如果一个表中需要频繁查询客户表和订单表,呢么就可以将这两个字段进行冗余存储,从而减少连接操作。

-- 反规范化的订单表设计
CREATE TABLE Orders (order_id INT PRIMARY KEY,customer_id INT,customer_name VARCHAR(100),  -- 冗余存储客户名称product_id INT,product_name VARCHAR(100),   -- 冗余存储商品名称order_date DATE
);-- 插入订单时冗余插入客户名称和商品名称
INSERT INTO Orders (order_id, customer_id, customer_name, product_id, product_name, order_date)
VALUES (201, 1, 'Alice', 101, 'Laptop', '2024-01-01'),(202, 2, 'Bob', 102, 'Phone', '2024-01-02');//查询指令
-- 查询订单详情,不需要 JOIN
SELECT order_id, customer_name, product_name, order_date
FROM Orders;

事务一致性

事务回顾

事务就是数据库的一组操作序列,这些操作要么全部成功要么全部失败,一个事务中可以包含有多个SQL语句,事务有四大特性ACID,原子性、一一致性、隔离性、持久性。

事务一致性就是在多表操作的时候,为了保证数据一致性,事务能够确保所有操作要么全部成功要么全部失败,在表之间有外键关联的时候,需要通过事务来支持确保数据的正确性。

事务和数据一致性的重要性

  • 防止脏读数据写入:多表关联情况下,如果没有使用事务,一部分表的数据写入成功,但是其他表写入失败,这样就会导致数据不一致的情况。例如订单信息插入成功,但是支付信息没有成功插入,这样就会导致存在订单却没有支付记录的脏数据

  • 维护外键的完整性:事务可以确保在涉及外键关联的多个表中,所有操作都正确的进行。例如如果插入的订单的时候没有客户信息或者插入支付信息中没有对应订单信息,外键约束就会被破坏,使用事务能够在发生错误的时候回滚,从而保证外键完整性。

  • 确保多表操作的原子性:多表操作正常都是涉及到多个操作,事务保证了这些操作的原子性,这些操作要么全部完成,要么全部失败。

事务操作的一些技巧

SAVEPOINT

也就是在事务中创建保存点,可以在事务的某个步骤回滚到这个保存点钟,而不是整个事务。例如在执行复杂操作的时候,某些部分是可以单独回滚的。

START TRANSACTION;INSERT INTO Orders (order_id, customer_id, order_date) 
VALUES (1002, 1, '2024-01-02');SAVEPOINT savepoint1;INSERT INTO OrderItems (order_item_id, order_id, product_name) 
VALUES (5002, 1002, 'Phone');-- 如果插入订单商品失败,可以回滚到插入订单之前
ROLLBACK TO savepoint1;-- 提交事务
COMMIT;

LOCK TABLES

高并发环境下,可以通过显式锁定表来确保事务的隔离性。通过隔离锁从而避免并发写入冲突,确保事务操作的安全性。

LOCK TABLES Orders WRITE, OrderItems WRITE;-- 插入订单和订单商品
INSERT INTO Orders (order_id, customer_id, order_date) 
VALUES (1003, 1, '2024-01-03');INSERT INTO OrderItems (order_item_id, order_id, product_name) 
VALUES (5003, 1003, 'Tablet');-- 解锁
UNLOCK TABLES;

表优化

仅提供思路,具体的实现后期补充

索引优化

通过优化索引,可以提高查询效率,减少数据库IO操作

  • 根据实际需求创建索引,根据表中的实际需求,为常用的子句创建索引
  • 避免冗余索引:定期检查和删除不再使用或者效果不好的索引,减少索引维护的开销
  • 使用覆盖索引:索引中应该包含查询所需要的所有列,避免回表操作
  • 前缀索引:对于长文本字段,应该使用前缀索引以节省空间

表结构优化

优化表结构,可以提高数据存取效率,节省存储空间

  • 遵循第三范式,消除数据的冗余,从而确保数据的一致性
  • 适度反规范化,为了查询性能的提高,可以适当的冗余存储部分数据,从而减少表关联操作
  • 合理数据结构,根据存储数据的特点选择合适的数据结构
  • 字段长度的优化,避免字段过长而导致空间的浪费
  • 垂直拆分,对于不常用的列分离到新表中,减少单表的宽度,从而提高缓存命中率
  • 水平拆分,就是对数据量巨大的表,按照特定的规则分散到多个表或者库中

查询优化

通过提高SQL查询的执行效率,从而降低响应时间

  • 避免全表扫描:确保查询条件中的列都有合适的索引支持
  • 优化SQL语句,避免使用select*,只查询必要的字段,避免在索引列上进行函数或者运算操作
  • 减少EXPLAIN分析执行计划:了解SQL的执行路径,发现并优化
  • 减少子查询的使用:尽量使用JSON来替代子查询,从而提高查询效率
  • 分页查询优化:对于大数据量进行分页,使用延迟关联或者子查询优化

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】mysql数据库迁移前应如何备份数据?

MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前,备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤,适用于大多数情况。请注意,具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…

mybatis 动态SQL语句

10. 动态SQL 10.1. 介绍 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述:MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦…

shell脚本_永久环境变量和字符串操作

一、永久环境变量 1. 常见的环境变量 2. 设置永久环境变量 3.1.将脚本加进PATH变量的目录中 3.2.添加进环境变量里 3.2.修改用户的 shell 配置文件 二、字符串操作 1. 字符串拼接 2. 字符串切片 3. 字符串查找 4. 字符串替换 5. 字符串大小写转换 6. 字符串分割 7…

【Go】-bufio库解读

目录 Reader和Writer接口 bufio.Reader/Writer 小结 其他函数-Peek、fill Reader小结 Writer Scanner结构体 缓冲区对于网络数据读写的重要性 Reader和Writer接口 在net/http包生成的Conn 接口的实例中有两个方法叫做Read和Write接口 type Conn interface {Read(b []b…

场景营销在企业定制开发 AI 智能名片 S2B2C 商城小程序中的应用与价值

摘要:本文深入剖析了品牌广告效果不佳与场景营销缺失之间的内在联系,阐述了场景营销对于品牌落地和转化的关键意义。同时,详细探讨了如何将场景营销理念与实践应用于企业定制开发的 AI 智能名片 S2B2C 商城小程序中,借助移动时代的…

uniapp 实现tabbar分类导航及滚动联动效果

思路&#xff1a;使用两个scroll-view&#xff0c;tabbar分类导航使用scrollleft移动&#xff0c;内容联动使用页面滚动onPageScroll监听滚动高度 效果图 <template><view class"content" ><view :class"[isSticky ? tab-sticky: ]">…

Flutter中的Material Theme完全指南:从入门到实战

Flutter作为一款热门的跨平台开发框架&#xff0c;其UI组件库Material Design深受开发者喜爱。本文将深入探讨Flutter Material Theme的使用&#xff0c;包括如何借助Material Theme Builder创建符合产品需求的主题风格。通过多个场景和代码实例&#xff0c;让你轻松掌握这一工…

aws中AcmClient.describeCertificate返回值中没有ResourceRecord

我有一个需求&#xff0c;就是让用户自己把自己的域名绑定我们的提供的AWS服务器。 AWS需要验证证书 上一篇文章中我用php的AcmClient中的requestCertificate方法申请到了证书。 $acmClient new AcmClient([region > us-east-1,version > 2015-12-08,credentials>[/…

Oracle 19c PDB克隆后出现Warning: PDB altered with errors受限模式处理

在进行一次19c PDB克隆过程中&#xff0c;发现克隆结束&#xff0c;在打开后出现了报错&#xff0c;PDB变成受限模式&#xff0c;以下是分析处理过程 09:25:48 SQL> alter pluggable database test1113 open instancesall; Warning: PDB altered with errors. Elapsed: 0…

【3D Slicer】的小白入门使用指南九

定量医学影像临床研究与实践 任务 定量成像教程 定量成像是从医学影像中提取定量测量的过程。 本教程基于两个定量成像的例子构建: - 形态学:缓慢生长肿瘤中的小体积变化 - 功能:鳞状细胞癌中的代谢活动 第1部分:使用变化跟踪模块测量脑膜瘤的小体积变化第2部分:使用PET标…

二、神经网络基础与搭建

神经网络基础 前言一、神经网络1.1 基本概念1.2 工作原理 二、激活函数2.1 sigmoid激活函数2.1.1 公式2.1.2 注意事项 2.2 tanh激活函数2.2.1 公式2.2.2 注意事项 2.3 ReLU激活函数2.3.1 公式2.3.2 注意事项 2.4 SoftMax激活函数2.4.1 公式2.4.2 Softmax的性质2.4.3 Softmax的应…

VMWare虚拟机安装华为欧拉系统

记录一下安装步骤&#xff1a; 1.在vmware中创建一个新的虚拟机&#xff0c;步骤和创建centos差不多 2.启动系统 具体的看下图&#xff1a; 启动虚拟机 耐心等待 等待进度条走完重启系统就完成了

如何进入python交互界面

Python交互模式有两种&#xff1a;图形化的交互模式或者命令行的交互模式。 打开步骤&#xff1a; 首先点击开始菜单。 然后在搜索栏中输入Python&#xff0c;即可看到图形化的交互模式&#xff08;IDLE&#xff08;Python 3.7 64-bit&#xff09;&#xff09;与命令行的交互…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来&#xff0c;安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

【STM32】USB 简要驱动软件架构图

STM32 USB 软件架构比较复杂&#xff0c;建议去看 UM 1734 或者 st wiki STM32 USB call graph STM32 USB Device Library files organization Reference [1]: https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_USB_with_STM32 [2]: UM1734

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十三)图优化SLAM的本质

一、直白解释slam与图优化的结合 我从b站上学习理解的这个概念。 视频的大概位置是1个小时以后&#xff0c;在第75min到80min之间。图优化SLAM是怎么一回事。 slam本身是有运动方程的&#xff0c;也就是运动状态递推方程&#xff0c;也就是预测过程。通过t1时刻&#xff0c…

Vue2教程002:Vue指令

文章目录 2、Vue指令2.1 开发者工具2.2 v-html2.3 v-show和v-if2.4 v-else和v-else-if2.5 v-on2.5.1 内联语句2.5.2 methods 2、Vue指令 2.1 开发者工具 通过谷歌应用商店安装&#xff08;需要科学上网&#xff09;通过极简插件安装 2.2 v-html Vue会根据不同的指令&#x…

使用WebSocket技术实现Web应用中的实时数据更新

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebSocket技术实现Web应用中的实时数据更新 使用WebSocket技术实现Web应用中的实时数据更新 使用WebSocket技术实现Web应用中…

单片机学习笔记 1. 点亮一个LED灯

把基础的东西都过一下&#xff0c;用来学习记录一下。 目录 1、Keil工程 2、Keil实现代码 3、烧录程序 0、实现的功能 点亮一个LED灯 1、Keil工程 打开Keil&#xff0c;Project----New uVision Project&#xff0c;工程文件命名----OK 选择单片机类型AT89C52&#xff0c;和…

使用Web Animations API实现复杂的网页动画效果

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂…