首页 > 数据库 >MySQL表设计与优化

MySQL表设计与优化

时间:2023-04-16 14:36:29浏览次数:47  
标签:name 查询 课程 MySQL 类型 设计 优化 id

影响MySQL查询性能的因素有很多,我们经常会对查询语句、索引字段做一些优化,而其实在表设计的阶段就可能产生一些问题。对于表设计,可以对表结构进行优化,也可以对表字段进行优化。以下通过一个具体的案例演示一些常用的表设计优化的方法。

一、业务需求

这里,就以学生-教师-课程业务作为示例。数据库需要存放学生、教师、课程相关信息。学生信息包括学号、姓名、性别、专业、年级、班级等;教师信息包括教师编号、姓名、入职时间等;课程表包括课程id、课程名称、课程概述、课时安排等信息。

根据需求,学生可以选修多门课程,具有一对多关系;教师也可以任教多门课程,具有一对多关系。所以,还需要建立对应的中间表。

二、初始构建

通过以上需求分析,可以构建出如下的关系图:

图片替换文本

在上图可以看出,表中字段已经满足了各个实体的需求,中间表也体现出了实体之间的对应关系。并且,表设计符合数据库第三范式

三、表结构优化

1、适度冗余

现在有一个需求,查询姓名为“张三”的学生选修的每门课程的总成绩。在初始构建的表中,需要先通过学生姓名查询出对应的学生id,再查询对应的课程和分数。查询语句如下:

-- 查询姓名为“张三”的学生选修的每门课程的总成绩
select s.name, c.name, c.total_grade 
from (
  select id, name from tb_student where name = '张三'
) s, 
(
  select sc.student_id, c.name, total_grade from tb_course c , tb_student_course sc WHERE c.id = sc.course_id
) c
where s.id = c.student_id;

得到结果:

图片替换文本

使用Explain分析,可以看到检索了三张表才得到结果。

图片替换文本

在实际场景中,我们经常使用学生姓名而不是学生id来进行查询,所以,可以在学生-课程中间表上添加冗余字段(学生姓名、课程名称)来优化查询,减少join连接查询。虽然冗余字段破坏了第三范式,但是从性能角度和使用场景分析,可以提高整体的效率。以下是优化后的学生-课程表:

图片替换文本

这时,查询姓名为“张三”的学生选修的每门课程的总成绩就不需要多表查询了,其查询语句如下:

select student_name, course_name, total_grade from tb_student_course where student_name = '张三';

2、大字段、不常用字段拆分

在课程表中,有两个较大的字段,分别为课程概述和课时计划,详细地介绍了课程的一些相关信息。在实际场景中,我们更经常查询课程教室、课程时间等信息。但是,当我们查询课程教室和课程时间字段的时候,数据库并不是只读取我们需要的字段,而是读取整条记录的字段,包括了课程概述和课时计划两个大字段。由于大字段所占的空间比例很大,所以会造成较大的资源浪费。

所以,我们可以将这两个不常用的大字段进行拆分,来提高查询性能。优化后的关系图如下:

图片替换文本

四、字段优化

一般来说,字段类型要在符号需求的情况下选择尽量小的类型。

1、数字类型

在学生-课程表中,包含了平时成绩、期末成绩、总成绩的字段,使用了double类型,保留两位小数。但对于成绩字段来说,其实并不需要这么大的字段,可以使用int类型来存放。对于保留两位小数,可以通过乘以100的固定系数转换为整数来存放。

2、时间类型

在设计时间类型时,要根据业务需求选用合适的时间类型。如果只需要记录年份,使用year类型;如果只需要记录日期YYYY-MM-DD,不需要具体时间,可以使用date类型;如果只需要具体时间hh:mm:ss,不需要日期,可以使用time类型。使用timestamp时,需要注意它的范围大小是否能满足需求。

3、字符类型

对于固定长度的字段,可以使用char类型;对于可变长度字段,可以使用varchar类型。varchar用于存储可变长度字符串,它比char类型更加节省空间,但是varchar需要使用1个或2个额外字节记录字符串的长度。

例如,性别字段,只需要用‘M’和‘F’来表示男、女,这时,可以使用char(1)。或者,可以使用tinyint(1)存放,用0表示男、1表示女。

对于身份证号,因为其是固定长度为18位,所以,可以采用char类型。

对于课程名称、详情等字段,它们的长度是不固定的,可以采用varchar类型。

所以,最终优化后的学生-课程-教室关系图如下:

图片替换文本

五、总结

以上通过一个具体案例解释了数据库的表设计与优化方法,包括表结构优化(如适度冗余、字段拆分),字段优化。

如果文中有不完善的地方,欢迎大家讨论交流!

标签:name,查询,课程,MySQL,类型,设计,优化,id
From: https://www.cnblogs.com/xwangkk/p/17323201.html

相关文章

  • php+mysql实现微信公众号回复关键词新闻列表
    非常抱歉,我之前理解有误。如果您想要实现在公众号发送关键词,返回新闻列表的功能,可以按照以下步骤进行操作:1.创建一个数据库表,用于存储新闻的标题、链接和内容等信息。例如,可以创建一个名为news的表,包含id、title、link和content等字段。2.在公众号后台设置自定义菜单或关键词......
  • 2023高效的mysql 随机语句 200万数据为例 用了 0.0030秒
    是的,如果数据表中有200万条记录,使用 ORDERBYRAND() 这种方式来随机选择记录会非常慢,因为MySQL需要对整个表进行排序,然后再返回指定数量的记录。这个过程需要消耗大量的时间和资源。为了提高效率,可以考虑使用其他方法来实现随机选择记录。以下是一些常用的方法:使用 WHER......
  • 10、数据库学习规划:MySQL - 学习规划系列文章
          MySQL数据库是笔者认识的几个流行的数据库之一。类似于Linux重装系统,其也是开源的,最主要是有很多的社区支持,众多的开发者对其能够进行使用,所以其功能也挺强大,便于使用。通过对MySQL数据库的学习,笔者认为其是现今贡献最大和使用最广泛的数据库。因为其有社区版,能够免......
  • 【转】MySQL死锁产生的原因和解决方法
    前言最近老顾经常碰到同事说,mysql又死锁了导致业务报错。今天我们就来聊聊死锁以及怎么解决锁类型mysql锁级别:页级、表级、行级表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发......
  • 前端设计,确定按钮正慢慢消失
    不论做什么产品,界面上几乎都少不了「确定」按钮,例如:操作提示时、进行选择时、填写表单数据时……完成、保存、下单……各种代表“确定某一步骤”的按钮,都可以统称为确定按钮。以前的产品设计,大量以来确定按钮,但是现在的产品设计,确定按钮用得越来越少了。倒不是因为不需要确定......
  • [全程建模]一个项目UML设计中的几个问题
    [全程建模]一个项目UML设计中的几个问题广州Sh**nGG(41****586) 2012/11/15 11:04:25各位前辈 针对昨天的那个问题 我做了一些用例图如下广州Sh**nGG(41****586) 2012/11/15 11:05:29针对以上的用例图 做出下面的类图广州Sh**nGG(41****586) 2012/11/15 11:06:52请......
  • 电饭煲主图设计
    #第一步,用快速选择工具进行抠图;利用选择并遮住功能,把图扣的柔和一些    #第二步,实景的背景怎么弄?找地板素材,尽量找一个透视接近的,调精细一点就要用到自由变换选区的斜切慢慢调整;电饭煲偏黄色,那么也找个偏黄色的地板  #第三步,找一个厨房背景素材,颜色也......
  • 自动驾驶技术的新进展:智能感知与决策的优化与实现
    自动驾驶技术是近年来备受关注的领域,随着科技的不断进步,自动驾驶技术也在不断地发展和完善。一、智能感知的优化智能感知是自动驾驶技术中非常重要的一环,它能够让车辆感知周围环境并做出相应的反应。目前,智能感知技术已经取得了很大的进展,主要表现在以下几个方面:1.传感器技术......
  • 基于DSP+FPGA+AD9238的冲击波超压测试系统设计与实现
    对冲击波关键特征参数进行可靠、精确地评估是进行军事行动规划的前提和依据,测试结果可以为战斗部设计提供参考,也可以为武器弹体材料的研发制造提供有效依据。近年来,随着集成电子技术与软件系统取得突破性成果,冲击波测试技术获得了稳定的发展。2.2测试系统的总体框架......
  • 基于DSP+FPGA的机载雷达伺服控制系统的硬件设计与开发(一)总体设计
    2.1功能要求及性能指标2.1.1功能要求(1)具备方位和俯仰两轴运动的能力;(2)方位轴可实现预置、周扫和扇扫功能;(3)俯仰轴可实现预置功能。2.1.2性能指标(1)运动范围:方位转动范围为,俯仰转动范围为;(2)角速度:方位最大角速度为100º/s,俯仰最大角速度为40º/s......