返回顶部
首页 > 资讯 > 数据库 >MySQL中的数据类型和schema优化是什么
  • 546
分享到

MySQL中的数据类型和schema优化是什么

2024-04-02 19:04:59 546人浏览 八月长安
摘要

小编给大家分享一下Mysql中的数据类型和schema优化是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!1. 选择优化的数据类型mysql支持的数据类型有很多,而如何选择出正确的数据类型

小编给大家分享一下Mysql中的数据类型和schema优化是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

1. 选择优化的数据类型

mysql支持的数据类型有很多,而如何选择出正确的数据类型,对于性能是至关重要的。以下几个原则能够帮助确定数据类型:

  1. 更小的通常更好

    应尽可能使用可以正确存储数据的最小数据类型,够用就好。这样将占用更少的磁盘、内存和缓存,而在处理时也会耗时更少。

  2. 简单就好

    当两种数据类型都能胜任一个字段的存储工作时,选择简单的那一方,往往是最好的选择。例如整型和字符串,由于整型的操作代价要小于字符,所以当在两者之间选择时,选择整型通常能够获得更好的性能。

  3. 尽量避免NULL

    当列可为NULL时,对于Mysql来说,在索引和值比较等方面需要做更多的工作,虽然对性能的影响不是很大,但也应尽量避免设计为可为NULL。

除了以上原则,在选择数据类型时,需遵循的步骤:首先确定合适的大类型,例如数据、字符串、时间等;然后再选择具体的类型。下面将讨论大类型下的一些具体类型,首先是数字,有两种类型:整数和实数。

1.1 整数类型

整数类型和所占用的空间如下:

整数类型空间大小(bit)
TINYINT8
SMALLINT16
MEDIUMINT24
INT32
BIGINT64

整数类型所能存储的范围和空间大小有关:-2^(N-1)至2^(N-1)-1,其中N为空间大小的位数。

整数类型具有UNSIGNED的可选属性,当声明时,表示不允许负数,则存储范围变为:0至2^(N)-1,扩大了一倍。

在MySQL中,还可以为整数类型指定宽度,例如INT(1),但这样的意义并不大,并不会限制值的合法范围,仍能存储-2^31至2^31-1的值,所影响的是与MySQL的交互工具显示字符的个数。

1.2 实数类型

实数类型的对比如下:

实数类型空间大小(Byte)取值范围计算精度
FLOAT4负数:-3.4E+38~-1.17E-38;非负数:0、1.17E-38~3.4E+38近似计算
DOUBLE8负数:-1.79E+308~-2.22E-308;非负数:0、2.22E-308~1.79E+308近似计算
DECIMAL与精度有关同DOUBLE精确计算

从上面可以看出,FLOAT和DOUBLE都有固定的空间大小,但同时由于是使用标准的浮点运算,所以只能近似计算。而DECIMAL则可以实现精确计算,与此同时占用的空间会相较更大,所耗费的计算开销也更多。

DECIMAL所占空间大小与指定的精度有关,例如DECIMAL(M,D):

  • M为整个数字的最大长度,取值范围为[1, 65],默认值为10;
  • D为小数点后的长度,取值范围为[0, 30],且D <= M,默认值为0。

MySQL在存储DECIMAL类型时会作为二进制字符串存储,每4个字节存9个数字,当不足9位时,数字的占用空间如下:

数字个数占用空间(Byte)
1、21
3、42
5、63
7、84

小数点前后将分别存储,同时小数点也要占1个字节。下面举两个计算的例子:

  1. DECIMAL(18, 9):整数部分长度为9,占用4个字节。小数部分长度为9,占用4个字节。同时加上小数点1个字节,则总共占用9个字节。
  2. DECIMAL(20, 9):整数部分长度为14,占用7(4+3)个字节。小数部分长度为9,占用4个字节。同时加上小数点1个字节,则总共占用12个字节。

可以看出DECIMAL的空间占用还是很大的,因此只有当需要对小数进行精确计算时,才需要使用DECIMAL。除此之外,我们还可以使用BIGINT代替DECIMAL,例如需要保证小数点后5位的计算,可以将值乘上10的5次方后作为BIGINT存储,这样能同时避免浮点存储计算不精确和DECIMAL精确计算代价高的问题。

1.3 字符串类型

最常用的字符串类型当属VARCHAR和CHAR。VARCHAR作为可变长字符串,会使用1或2个额外字节记录字符串的长度,当最大长度未超过255时,只需1个字节记录长度,超过255,则需2个字节。VARCHAR的适用场景

  1. 最大长度比平均长度大很多;
  2. 列的更新少,避免碎片;
  3. 使用复杂的字符集,如UTF-8,每个字符能使用不同的字节存储。

CHAR则为定长字符串,根据定义的字符串长度分配足够的空间,适用场景

  1. 长度短;
  2. 长度相近,例如MD5;
  3. 经常更新。

除了VARCHAR和CHAR,针对存储大字符串,可以使用BLOB和TEXT类型。BLOB和TEXT的区别在于,BLOB是以二进制方式存储,而TEXT是以字符方式存储。这也导致,BLOB类型的数据没有字符集的概念,无法按字符排序,而TEXT类型则有字符集的概念,可以按字符排序。两者的使用场景,也由存储格式决定了,当存储二进制数据时,例如图片,应使用BLOB,而存储文本时,例如文章,则应使用TEXT类型。

1.4 日期和时间类型

MySQL中所能存储的最小时间粒度为秒,常用的日期类型有DATETIME和TIMESTAMP。

类型存储内容空间大小(Byte)时区概念
DATETIME格式为YYYYMMDDHHMMSS的整数8
TIMESTAMP从1970年1月1日零点以来的秒数4

TIMESTAMP显示的值将依赖于时区,意味在不同时区查询到的值将不一样。除了以上列出的不同,TIMESTAMP还具有一个特殊属性,在插入和更新时,如果没有指定第一个TIMESTAMP列的值,将会设置这个列的值为当前时间。

我们在开发过程中,应尽量使用TIMESTAMP,主要是因为其空间大小仅需DATETIME的一半,空间效率更高。

如果我们想存储的日期和时间精确到秒之后,怎么办?由于MySQL并未提供,所以我们可以使用BIGINT存储微妙级别的时间戳,或者使用DOUBLE存储秒之后的小数部分。

1.5 选择标识符

通常来说整数是标识符的最好选择,主要是因为其简单,计算快,且可使用AUTO_INCREMENT。

2. 范式和反范式

简单来说,范式就是一张数据表的表结构所符合的某种设计标准的级别。第一范式,属性不可分割,现在的RDBMS系统建成的表都是符合第一范式的。而第二范式,则是消除非主属性对码(可以理解为主键)的部分依赖。第三范式消除非主属性对码的传递依赖。具体的介绍,可以读读知乎上的这个回答(https://www.zhihu.com/question/24696366/answer/29189700)

严格范式化数据库中,每个事实数据会出现且只出现一次,不会出现数据冗余,这样所能带能带来的好处有:

  1. 更新操作更快;
  2. 修改更少的数据;
  3. 表更小,更好地放内存中,执行操作更快;
  4. 更少需要DISTINCT或GROUP BY。

但也由于数据分散存在各张表中,查询时需要对表进行关联。而反范式的优点则是不用进行关联,将数据冗余存储。

在实际应用中,不会出现完全的范式化或完全的反范式化,时常需要混用范式和反范式,使用部分范式化的schema,往往是最好的选择。关于数据库设计,在网上看到这样一段话,大家可以感受下。

数据库设计应该分为三个境界:

第一境界:刚入门数据库设计,范式的重要性还未深刻理解。这时候出现的反范式设计,一般会出问题。

第二境界:随着遇到问题解决问题,渐渐了解到范式的真正好处,从而能快速设计出低冗余、高效率的数据库。

第三境界:再经过N年的锻炼,是一定会发觉范式的局限性的。此时再去打破范式,设计更合理的反范式部分。

范式就像武侠里面的招数,初学者妄想不按招数来,只能死的很难堪。毕竟招数都是高手总结归纳的精华。而随着武功提高,招数熟练之后,必然是发现招数的局限性,要么忘掉招数,要么自创招数。

只要努力,加上多熬几年,总能达到第二个境界,总会觉得范式是经典。此时能不过分依赖范式,快速突破范式局限性的人,自然是高手。

4. 缓存表和汇总表

除了上述说到的反范式,在表中存储冗余数据,我们还可以创建一张完全独立的汇总表或缓存表,来满足检索的需要。

缓存表,指的是存储可以从schema其他表中获取数据的表,也就是逻辑上冗余的数据。而汇总表,则指的是存储使用GROUP BY等语句聚合数据,计算出的不冗余的数据。

缓存表,可用于优化搜索和检索查询语句,这里可以使用的技巧有对缓存表使用不同的存储引擎,例如主表使用InnoDB,而缓存表则可使用MyISAM,获得更小的索引占用空间。甚至可以将缓存表放到专门的搜索系统中,例如Lucene。

汇总表,则是为了避免实时计算统计值所带来的高昂代价,代价来自两方面,一是需要扫描表中的大部分数据,二是建立特定的索引,会对UPDATE操作有影响。例如,查询微信过去24小时的朋友圈数量,则可固定每1小时扫描全表,统计后写一条记录到汇总表,当查询时,只需查询汇总表上最新的24条记录,而不必每次查询时都去扫描全表进行统计。

在使用缓存表和汇总表时,必须决定是实时维护数据还是定期重建,这取决于我们的需求。定期重建相比实时维护,能节省更多的资源,表的碎片更少。而在重建时,我们仍需保证数据在操作时可用,需要通过“影子表”来实现。在真实表后创建一张影子表,当填充好数据后,通过原子的重命名操作来切换影子表和原表。

5. 加快ALTER TABLE操作的速度

当MySQL在执行ALTER TABLE操作时,往往是新建一张表,然后把数据从旧表查出并插入到新表中,再删除旧表,如果表很大,这样需要花费很长时间,且会导致MySQL的服务中断。为了避免服务中断,通常可以使用两种技巧

  1. 在一台不提供服务的机器上执行ALTER TABLE操作,然后再与提供服务的主库进行切换;
  2. “影子拷贝”,建立一张与原表无关的新表,在数据迁移完成后,通过重命名操作进行切换。

但也不是所有的ALTER TABLE操作会引起表重建,例如在修改字段的默认值时,使用MODIFY COLUMN会进行表重建,而使用ALTER COLUMN则不会进行表重建,操作速度很快。这是因为ALTER COLUMN在修改默认值时,会直接修改了存在表的.frm文件(存储字段的默认值),而并未重建表。

看完了这篇文章,相信你对MySQL中的数据类型和schema优化是什么有了一定的了解,想了解更多相关知识,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的数据类型和schema优化是什么

本文链接: https://lsjlt.com/news/53082.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL中的数据类型和schema优化是什么
    小编给大家分享一下MySQL中的数据类型和schema优化是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!1. 选择优化的数据类型MySQL支持的数据类型有很多,而如何选择出正确的数据类型...
    99+
    2024-04-02
  • MySQL中的数据类型和schema优化
    最近在学习MySQL优化方面的知识。本文就数据类型和schema方面的优化进行介绍。 1. 选择优化的数据类型 MySQL支持的数据类型有很多,而如何选择出正确的数据类型,对于性能是至关重要的。以下几个原则能够帮助确定数据类型: 更小的通...
    99+
    2022-04-18
    MySQL中的数据类型和schema优化 数据库入门 数据库基础教程 数据库 mysql
  • 详解MySQL中的数据类型和schema优化
    最近在学习MySQL优化方面的知识。本文就数据类型和schema方面的优化进行介绍。 1. 选择优化的数据类型 MySQL支持的数据类型有很多,而如何选择出正确的数据类型,对于性能是至关重要的。以下几个原则能够帮助...
    99+
    2022-05-19
    MySQL 数据类型 MySQL schema优化
  • Schema与数据类型优化的示例
    小编给大家分享一下Schema与数据类型优化的示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!4.2MySQL schema设计中的陷阱1、太多的列MySQL存储引擎api工作时需要在服...
    99+
    2024-04-02
  • Schema与数据类型优化的方法
    这篇文章主要介绍Schema与数据类型优化的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!schema就是数据库对象的集合,这个集合包含了各种对象如:表、视图、存储过程、索引等。...
    99+
    2024-04-02
  • MySQL如何优化Schema与数据类型性能
    本文主要给大家介绍MySQL如何优化Schema与数据类型性能,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL如何优化Schema与数据类型...
    99+
    2024-04-02
  • 什么是MySQL的数据类型
    不知道大家之前对类似什么是MySQL的数据类型的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完什么是MySQL的数据类型你一定会有所收获的。一、概述:MySQL数据...
    99+
    2024-04-02
  • mysql中decimal是什么数据类型
    decimal 是 mysql 中用于存储定点小数的高精度数据类型。其特点包括:精度(由 (m, d) 指定)、范围、精度不丢失、存储空间。它常用于需要高精度货币计算的场景,如银行系统、...
    99+
    2024-04-26
    mysql
  • MySQL数据类型优化原则
    MySQL支持的数据类型很多,选择正确的数据类型对于高性能至关重要。下面几个简单的原则都有助于做出更好的选择。 更小的通常更好 应该尽量使用可以正确储存数据的最小数据类型。更小的数据类型通常更快,因为它...
    99+
    2022-05-31
    MySQL 数据类型 MySQL 数据类型优化
  • Oracle 10g中数据类型BINARY_FLOAT和BINARY_DOUBLE的优点是什么
    这期内容当中小编将会给大家带来有关Oracle 10g中数据类型BINARY_FLOAT和BINARY_DOUBLE的优点是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收...
    99+
    2024-04-02
  • MYSQL(三)数据类型的优化选择
    整数类型:Tinyint-8Smallint-16Mediumint-24Int-32Bigint-64实数类型(带有小数部分的数字)Float-4/double-8:浮点Decimal:精确(只是存储格式...
    99+
    2024-04-02
  • mysql是什么类型的数据库
    小编给大家分享一下mysql是什么类型的数据库,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql是什么类型的数据库MySQL是一种关系型数据库管理系统,使用sql语言对数据库进行管理的。...
    99+
    2024-04-02
  • mysql数据库的类型是什么
    本篇内容介绍了“mysql数据库的类型是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • mysql是什么类型的数据库?
    mysql是一种开源、跨平台的关系型数据库管理系统,以其速度、可靠性、易用性、高性能、可扩展性和兼容性而著称。它广泛应用于web开发、数据仓库、电子商务、金融服务、医疗保健等领域。 M...
    99+
    2024-04-14
    mysql linux macos
  • mysql数据库是什么类型
    mysql 是一款开源、跨平台的关系型数据库管理系统 (rdbms)。它提供以下主要特性:开源:免费供任何人使用和修改。跨平台:可在各种操作系统上运行。高性能:快速处理大量数据。可靠性:...
    99+
    2024-04-14
    mysql linux macos 移动应用程序
  • mysql是什么类型数据库
    mysql 是一款关系型数据库管理系统 (rdbms),它以开源、跨平台、高性能和广泛使用而著称。 MySQL 是一款什么类型的数据库? MySQL 是一款关系型数据库管理系统 (RD...
    99+
    2024-04-02
  • mysql bit数据类型指的是什么
    这篇文章主要介绍“mysql bit数据类型指的是什么”,在日常操作中,相信很多人在mysql bit数据类型指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysq...
    99+
    2023-04-14
    mysql
  • ASP 中的数据类型优化技巧
    ASP 中的数据类型优化技巧 ASP 是一种动态网页开发技术,它支持多种数据类型,包括字符串、数字、日期等。在开发 ASP 应用程序时,数据类型的选择和使用对性能和可维护性都有很大影响。本文将介绍 ASP 中数据类型的优化技巧,以提高应用程...
    99+
    2023-11-12
    并发 数据类型 编程算法
  • Python中的数据类型:numpy对象的优势和限制是什么?
    Python是一种高级编程语言,它可以处理各种不同的数据类型。其中,numpy是一种非常强大的数据类型,它提供了一系列的数组和矩阵计算工具,可以帮助我们处理大量数据。在本文中,我们将探讨numpy对象的优势和限制。 一、numpy对象的优...
    99+
    2023-07-20
    数据类型 numy 对象
  • mysql中有什么数据类型
    这篇文章将为大家详细讲解有关mysql中有什么数据类型,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql数据类型有:1、数值类型;2、日期和时间类型;3、字符串类型...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作