热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

提升MySQL数据库架构性能的策略与方法

为了提升MySQL数据库架构的性能,本文探讨了多种策略与方法。首先,分析了影响数据库性能的关键因素,并详细阐述了数据库结构优化的重要性。接着,介绍了数据库设计的基本步骤,包括第一、第二和第三范式的应用,以及反范式化设计的场景。此外,还讨论了数据库物理设计的关键要素,如表定义、索引设计和存储引擎选择,以确保高效的查询响应和数据管理。

  • 影响Mysql数据库的因素
  • 数据库结构优化的目的
  • 数据库结构设计的步骤
  • 数据库设计范式
    • 数据库设计的第一范式
    • 数据库设计的第二范式
    • 数据库设计的第三范式
    • 反范式化设计
  • 数据库物理设计
    • 定义数据库表及字段的命名规范
    • 选择合适的存储引擎
    • 物理设计-数据类型的选择
影响Mysql数据库的因素
  1. 服务器硬件
  2. 操作系统
  3. mysql服务器配置
  4. 数据库结构(影响最大)

良好的数据库逻辑设计和物理设计是数据库获得高性能的基础

数据库结构优化的目的
  1. 减少数据的冗余
  2. 尽量避免数据维护中出现 更新、插入、删除异常
  3. 节约数据存储空间
数据库结构设计的步骤
  1. 需求分析:全面了解产品设计的存储需求
  2. 逻辑设计:设计数据的逻辑存储结构
  3. 物理设计:根据所使用的数据库特点进行表结构设计
  4. 维护优化:根据实际情况对索引、存储结构等进行优化
数据库设计范式

数据库设计的第一范式:

  • 数据库表中的所有字段都具有单一属性(即字段不能再分割了)
  • 单一属性的列是由基本数据类型所构成的
  • 设计出来的表都是简单的二维表

数据库设计的第二范式:

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

数据库设计的第三范式:

首先要满足第二范式,其次非主属性之间不存在函数依赖。由于满足了第二范式,表示每个非主属性都函数依赖于主键。如果非主属性之间存在了函数依赖,就会存在传递依赖,这样就不满足第三范式。

总结:
第一范式就是原子性,字段不可再分割;
第二范式就是完全依赖,没有部分依赖;
第三范式就是没有传递依赖

反范式化设计

反范式化就是为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反,而允许存在少量的数据冗余,也就是使用空间来换取(查询)时间

不能要求完全按照范式化的要求进行数据库设计,要考虑以后表的使用(查询等)
举个例子:比如订单表中应该保留当前购买商品的价格、商品的名称(商品的价格是会变动的,这很危险)

范式化设计的优缺点
优点:

  1. 可以尽量的减少数据冗余
  2. 范式化的更新操作比反范式化更快
  3. 范式化的表通常比反范式化更小

缺点:

  1. 对于查询需要关联多个表
  2. 更难进行索引优化

反范式化设计的优缺点
优点:

  1. 可以减少表的关联
  2. 可以更好的进行索引优化

缺点:

  1. 存在数据冗余和数据维护异常
  2. 对数据修改需要更多的成本
数据库物理设计
  • 定义数据库、表及字段的命名规范
  • 选择合适的存储引擎
  • 为表中的字段选择合适的存储引擎
  • 建立数据库表

定义数据库、表及字段的命名规范

  • 数据库、表、字段的命名要遵守可读性原则
  • 数据库、表、字段的命名要遵守表意性原则(采用英文,且意思准确)
  • 数据库、表、字段的命名要遵守长名原则(尽量不要使用缩写)

选择合适的存储引擎

《Mysql数据库结构优化》

物理设计-数据类型的选择

为表中字段选择合适的数据类型:
当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期类型或二进制类型,最后是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型

如何选择正确的整数类型

《Mysql数据库结构优化》

如何选择正确的实数类型

《Mysql数据库结构优化》

如何选择varchar和char类型

varchar类型特点:

  • varchar和char是以字符为单位的,不是字节。一个字符可能占用多个字节
  • varchar用于存储变长字符串,只占用的必要的存储空间。

char类型特点:

  • char类型是定长的
  • 字符串存储在char类型的列中会删除末尾的空格
  • char类型的最大宽度为255

varchar使用场景:

  • 适用于存储很少被更新的字符串列

char使用场景:

  • 适合存储长度近似的值
  • 适合存储短字符串
  • 适合存储经常更新的字符串

如何存储日期类型

datatime类型

  • datatime类型与时区无关,占用8个字节的存储空间
  • 存储范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
  • 如果需要存储微秒时间,则需要指定宽度,比如datetime(6)

timestamp类型

  • timestamp类型占用4个字节,显示依赖于所指定的时区
  • 范围为1970-01-01 08:00:01到2038-01-19 11:14:07
  • TIMESTAMP支持的范围比DATATIME要小,容易出现超出的情况
  • TIMESTAMP类型在默认情况下,insert、update 数据时,TIMESTAMP列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。
  • TIMESTAMP比较受时区timezone的影响以及MYSQL版本和服务器的SQL MODE的影响

date类型和time类型

  • 占用字节比字符串、datetime、int存储类型要少,使用date类型只需要3个 字节
  • 使用date类型还可以利用日期和时间函数进行日期之间的计算
  • 仅有日期值,没有时间部分。以’YYYY-MM-DD’格式显示DATE值,支持的范围是’1000-01-01’到’9999-12-31’。
  • TIME数据类型表示一天中的时间。以”HH:MM:SS”格式显示TIME值。支持的范围是’00:00:00’到’23:59:59’。

使用日期时间存储类型注意事项

  • 不要使用字符串类型来存储日期、时间数据,日期时间类型通常比字符串占用更少的存储空间
  • 日期时间类型在进行查找过滤时,可利用日期来进行对比
  • 日期时间类型有丰富的处理函数,可以方便的对日期类型进行计算
  • 使用int存储日期时间,不如使用timestamp

参考链接

数据库设计三大范式
第五章 SqlServer之数据库三大范式

MySQL之char、varchar和text的设计
Mysql时间字段格式如何选择,TIMESTAMP,DATETIME,INT?


推荐阅读
  • MySQL DateTime 类型数据处理及.0 尾数去除方法
    本文介绍如何在 MySQL 中处理 DateTime 类型的数据,并解决获取数据时出现的.0尾数问题。同时,探讨了不同场景下的解决方案,确保数据格式的一致性和准确性。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • MySQL DATETIME 类型长度及使用指南
    本文详细介绍了 MySQL 中 DATETIME 类型的长度要求及其格式规范,并补充了其他常见数据类型的说明,帮助开发者更好地理解和使用这些类型。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本文介绍了如何利用MongoDB的$exists操作符在Java应用程序中检查特定字段是否存在于文档中,包括示例代码和解释。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 本文详细介绍了ASP.NET缓存的基本概念和使用方法,包括输出缓存、数据缓存及其高级特性,如缓存依赖、自定义缓存和缓存配置文件等。通过合理利用这些缓存技术,可以显著提升Web应用程序的性能。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
author-avatar
静净精时
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有