首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

高性能MySQL(三):Schema与数据类型优化

文章目录 选择优化的数据类型 整数类型 字符串类型 BLOG 和 TEXT 类型 使用枚举(ENUM)代替字符串 MySQL schema设计中的问题 选择优化的数据类型 MySQL支持的数据类型非常多...,选择正确的数据类型对于获得高性能至关重要。...CHAR: CHAR类型是定长的,当存储CHAR值时,MySQL会删除所有的末位空格。CHAR值会根据需要采用空格进行填充以方便比较。 CHAR适合存储很短的字符串,或者所有的值都接近一个长度。...MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到一个或者两个字节中,MySQL会在内部将每个值在列表中的位置保存成整数,并且在表的.frm文件中保存 “数字 - 字符串”映射关系的查找表。...---- MySQL schema设计中的问题 虽然有一些好的或换的的设计原则,但也有一些问题是由MySQL的实现机制导致的,这意味着有可能犯一些只在MySQL下发生的特定错误。

64510

高性能MySQL (一):Schema与数据类型优化

项目地址:github.com/cachecats/c… 一、选择优化的数据类型 MySQL 支持的数据类型非常多,选择正确的数据类型至关重要。下面的几个简单原则有助于做出更好的选择。...有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。...当存储CHAR值时,MySQL会删除所有的末尾空格。 CHAR适合存储很短的字符串,或者所有值都接近同一个长度。例如,CHAR非常适合存储密码的MD5值,因为这是一个定长的值。...标识列也可能在另外的表中作为外键使用,所以为标识列选择数据类型时,应该选择跟关联表中的对应列一样的类型。...本节我们讨论设计MySQL的schema的问题。这也许会帮助你避免这些错误,并且选择在MySQL特定实现下工作得更好的替代方案。

1.1K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL的复杂数据类型,学会使用再也不怕复杂场景了、枚举(ENUM)、集合(SET)、JSON、空间数据类型

    本文将深入探讨MySQL中的枚举类型(ENUM)、集合类型(SET)、JSON类型以及空间数据类型 枚举类型(ENUM) 枚举类型是一种用于存储固定值列表的数据类型。...它允许将列限制为预定义的一组值之一,只能选择这些值中的一个。枚举类型不仅是字符型数据类型,还具有数据安全性、存储优化和数据可读性的优点。...ENUM类型的创建和使用 创建包含ENUM类型的表 在创建表时,可以将列定义为ENUM类型,并列出所有可能的值。...但是,新的值必须包含现有的所有值,否则现有的数据可能无法匹配新的枚举列表,导致数据不一致。...与ENUM不同,SET可以包含零个或多个选定的值。 灵活性:SET类型允许用户选择多个值,并且这些值之间没有互斥关系。 应用场景:SET类型常用于表示具有多个属性的字段,如用户角色、产品标签等。

    17110

    MySQL数据类型与优化

    关于数据类型的优化 1、假如只需要存0~255之间的数,无负数,应使用tinyint unsigned(保证最小数据类型) 2、如果长度不可定,如varchar,应该选择一个你认为不会超过范围的最小类型...因为CPU不支持对DECIMAL的直接计算,在MySQL5.0及更高版本中,MySQL服务器自身实现了DECIMAL的高精度计算。相对而言,CPU直接支持原生的浮点运算,所有浮点运算明显更快。...枚举列可以把一些不重复的字符串存储成一个预定义的集合。MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到一个或两个字节中。...3、枚举最不好的地方就是字符串列表是固定的,添加或删除字符串必须使用ALTER TABLE。对于一系列将来可能会改变的字符串,枚举可能不是一个很好的选择,除非能接收在列表末尾添加元素。...4、由于MySQL把每个枚举值都保存为整数,并且必须进行查找才能转换为字符串,所以枚举列有一些开销,通常枚举列都比较小,所以开销还可以控制,在特定情况下,把CHAR/VARCHAR列与枚举列进行关联可能会直接比关联

    1.6K10

    高性能MySQL(2)——Schema与数据类型的优化

    一、选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管 存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择。...可为NULL的列会使用更多的存储空间,在 MySQL里也需要特殊处理。 在为列选择数据类型时: 第一步需要确定合适的大类型:数字、字符串、时间等; 第二步是选择具体类型。...有符号和无符号具有相同的存储空间和性能,根据实际情况选择合适的类型。...MySQL在内部会将列中的枚举值保存为整数,在.frm文件中保存一个“数字->字符串”的映射关系,通过数字快速的查找到具体的枚举值。...了解讨论设计MySQL的 schema的问题。这也许会帮助我们避免这些错误,并且选择在MySQL特定实现下工作得更好的替代方案。

    72620

    《高性能Mysql》读书笔记之Schema与数据类型优化

    一、选择优化的数据类型 原则 使用可以正确存储的最小数据类型 小的数据类型占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少 选择简单的数据类型 简单的数据类型通常需要更少的...,并具有相同的性能 MYSQL可以位整数指定宽度,例如INT(11),对大多数应用是没有意义的:它不会限制值的合法范围,只是规定了MYSQL的一些交互工具用来显示的字符个数。...适合场景 字符串列的最大长度比平均长度大得多 ; 列的更新很少,没有碎片问题;使用了像UTF-8这样复杂的字符集,每个字符集都是用不同字节存储 适合存储很短的字符串,或者所有值都接近同一个长度 注意点...MYSQL存储的是每个值在列表中的位置,而不是实际的值,实际的值存在 .frm 文件中保存"数字 - 字符串"映射关系 枚举按照内部存储的整数而不是定义的字符串进行排序,所以创建枚举的时候得按顺序存放...该操作会通过排序来构建所有索引,包括唯一索引 总结 避免过度设计 避免NULL值 使用小而简单的适合的数据类型 尽量使用相同的数据类型存储相似或相关的值,尤其是在关联条件中使用的列 注意可变长字符串,其在临表和排序时可能导致最大长度分配内存

    18030

    MySQL枚举类型enum字段在插入不在指定范围的值时, 是否是”插入了enum的第一个值”?…「建议收藏」

    刚刚在看MySQL>>一书的”ENUM类型”一节, 以下面的代码举例, 得出结论: “还可以看出对于不在ENUM指定范围内的值时, 并没有返回警告, 而是插入了enum(‘M’, ‘F’)的第一个值...> 不同 MySQL 版本处理方式不一样,像 5.5 这些默认不严格的会自动处理,5.7 及以上的默认是严格处理,所以会出错。...这个相当于是一个警告信息,在我本地测试的 5.7 中,直接插入会报错,但是使用 ignore 后,数据能被强制插入,但是是空值。...在 MySQL 枚举类型的“八宗罪” 这篇文章的第七条,文中提到了,如果不合法会被处理成空字符串,在后一段中又提到了因为类型的缘故,会根据枚举索引去取值。...for column ‘genter’ at row 1“; 所以,建议开发中尽量不用枚举类型,免得报无谓的错误; 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/

    1.8K20

    MySQL系列之数据类型及约束

    内容简介 本篇会分两部分介绍: 第一部分:MySQL中的数据类型 第二部分:MySQL中的字段约束 MySQL中的数据类型 MySQL是存储数据的数据库,涉及到数据就需要有数据的类型,MySQL中的数据类型大致可以分为以下五类...枚举类型 MySQL中的枚举类型严格来说算是字符串类型,枚举类型的作用就是给出几个选项,该字段就只能在这几个选项中进行选择,类似于Excel中的下来菜单。...主键约束,用于保证该字段的值具有唯一性,并且非空 比如学生的学号、员工的编号等 UNIQUE:唯一约束,用于保证该字段的值具有唯一性,可以为空 比如座位号 FOREIGN KEY:外键约束,用于限制两个表的关系...,用于保证该字段的值必须来自于主表的关联列的值 在从表添加外键约束,用于引用主表中某列的值 比如学生表的班级编号,员工表的部门编号,员工表的工种编号 AUTO_INCREMENT :自增约束,在表中插入数据时...总结 数据类型的使用取决于该字段的存储内容,一定要选择合适的类型以及约束,这样可以让数据库的性能提升不少。 本系列下篇就正式开始查询语句了,大家快快关注我!!

    52010

    SqlAlchemy 2.0 中文文档(四十一)

    与String表示所有数据库都具有的字符串数据类型不同,不是每个后端都有真正的“布尔”数据类型;一些后端使用整数或比特值 0 和 1,一些具有布尔字面常量true和false,而另一些则没有。...后端特定的“大写字母”数据类型 大多数数据库还具有完全特定于这些数据库的数据类型,或者添加了特定于这些数据库的附加参数。...请注意,这会影响到具有枚举值的 LIKE 表达式的使用(这是一个不寻常的用例)。...后端特定“大写”数据类型 大多数数据库还具有自己的数据类型,这些数据类型要么完全特定于这些数据库,要么添加了特定于这些数据库的附加参数。...", "mariadb"), ), ) 在上述表定义中,"bio"列将在所有后端具有字符串行为。

    30810

    第11章、数据类型

    数字类型 MySQL 支持标准 SQL 中所有数据类型。...显示宽度不限制可以存储在列中的值的范围,也不会阻止比列显示宽度更宽的值被正确显示。 所有的整数类型都可以有一个可选的(非标准的)UNSIGNED,当你需要更大的范围时可供选择。...使用磁盘会导致性能损失,因此只有在确实需要时才在查询结果中包含 BLOB或TEXT列。例如,避免使用 SELECT *,它会选择所有列。...t -> ORDER BY comment; ENUM 枚举是一个字符串对象,其值是从表创建时列规范中显式枚举的允许值列表中选择的值。...其他的存储引擎,暂不展开; 选择正确的列类型 为了优化存储,你需要选择最精确的数据类型;以范围1~9999的整型数据为例,MEDIUMINT UNSIGNED是最佳的选择;既能满足存储需求,又可以使用最少的存储量

    1.7K20

    MySQL-2

    Schema与数据类型优化 选择数据类型 1、更小的通常更好,即满足需求下尽可能使用小的数据类型(占用更少的磁盘,内存和CPU)。...有很多种方法可以指定浮点列所需要的精度,这使得MySQL会选择不同的数据类型或在存储时对值进行取舍。这些精度定义是非标准的,所以建议只指定数据类型而不指定精度。...CHAR类型时定长的:MySQL总是根据定义的字符串的长度分配足够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格。CHAR值会根据需要采用空格进行填充以方便比较。...CHAR适合存储很短的字符串,或者所有值都接近于一个长度。CHAR适合存储密码的MD5值,对于不经常变更的值CHAR也比较合适。对于比较短的列,CHAR比VARCHAR在存储空间上也更有效率。...变相的枚举:枚举列允许在列中存储一组定义值中的单个值,集合(SET)则允许在列中存储一组定义值中的一个或多个值。

    82110

    MySQL从零开始:05 MySQL数据类型

    MySQL中的每种数据类型都可以通过以下特征来确定: 它用来表示数据值。 占用的空间以及值是固定长度还是可变长度。 数据类型的值可以被索引。 MySQL如何比较特定数据类型的值。...1 数值类型 MySQL支持所有标准SQL数值数据类型。...它们对应于四个 BLOB 类型,并且具有相同的最大长度和存储要求。 3.4 ENUM 类型 ENUM 是一个字符串对象,它从一个允许值列表中选择了一个值,这些值在表创建时显式地列出了列规范中。...枚举值必须是引用的字符串文字。...3.5 SET 类型 SET 是一个字符串对象,可以有0个或多个值,并且每一个值都必须从表创建时指定的允许值列表中选择。SET 的列值由多个集合成员组成的,用逗号(,)分隔。

    2.3K30

    数据库之数据类型详解

    一、数据类型简介 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容; 不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算...ENUM 是一个字符串对象,其值为表创建时在列规定中枚举(即列举)的一列值,语法格式为:字段名 ENUM ('值1', '值2', ........ENUM 值在内部用整数表示,每个枚举值均有一个索引值:列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号。枚举最多可以有 65535 个元素。...','bad') -> ); #插入数据测试,第二列的值,可以直接写枚举中包含的值,也可以通过所在位数来调用 mysql> insert into tab10 values(70,'good'...'值n'); 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每一个值都有一个索引编号; 与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合

    4.3K30

    《高性能MySQL》读书笔记

    查询 慢查询日志 pt-query-digest 优秀资料 慢SQL定位分析 选择优化的数据类型 整数类型 字符串类型 BLOG 和 TEXT 类型 使用枚举(ENUM)代替字符串 MySQL schema...95%:表示Attribute列描述的Exec time、Lock time等属性的所有值从小到大排 列,然后取位于95%位置的那个数值(需要重点关注这个值)。...---- 选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。...有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。 实数的话,DECIMAL。 ---- 字符串类型 VARCHAR和CHAR是主要的字符串类型。...CHAR: CHAR类型是定长的,当存储CHAR值时,MySQL会删除所有的末位空格。CHAR值会根据需要采用空格进行填充以方便比较。 CHAR适合存储很短的字符串,或者所有的值都接近一个长度。

    38620

    SqlAlchemy 2.0 中文文档(五)

    一组 ORM 模型通常会具有一种对所有映射类都通用的主键风格。还可能存在一些常见的列配置,例如带有默认值的时间戳和其他预先设置大小和配置的字段。...一组 ORM 模型通常会有一种对所有映射类都通用的主键样式。还可能有常见的列配置,例如具有默认值的时间戳和其他预先设置大小和配置的字段。...一组 ORM 模型通常会有一种对所有映射类都通用的主键样式。还可能有常见的列配置,例如具有默认值的时间戳和其他预先确定大小和配置的字段。...对于 MySQL/MariaDB 或 PostgreSQL 以外的后端,在所有情况下都使用VARCHAR(第三方方言可能具有自己的行为)。...对于不是 MySQL/MariaDB 或 PostgreSQL 的后端,VARCHAR 在所有情况下都会被使用(第三方方言可能具有自己的行为)。

    29610

    《MySQL入门很轻松》第4章:数据表中能存放的数据类型

    MySQL支持多种数据类型,大致可以分为三类,分别是数值类型、日期和时间类型、字符串(字符)类型。 1.1 数值类型 MySQL支持所有标准SQL数值数据类型。...MySQL 提供多种整数类型,不同的数据类型提供的取值范围不同,可以存储的值的范围越大,其所需要的存储空间也就越大,因此要根据实际需求选择适合的数据类型。...<232 ENUM 枚举类型,只能有一个枚举字符串值 1或2字节,取决于枚举值的数目(最大值...MySQL 提供了大量的数据类型,为了优化存储,提高数据库性能,在任何情况下均应使用最精确的类型,即在所有可以表示该列值的类型中,该类型使用的存储最少 整数和浮点数 如果不需要小数部分,则使用整数来保存数据...默认的情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL 会把 TIMESTAMP列设为当前的时间。

    2K00

    SQL笔记(1)——MySQL创建数据库

    在不同的操作系统和环境下,命令行方式都是通用的,具有一定的适用性和便捷性,这大大增加了 MySQL 数据库的可移植性和易用性。...root,root 用户是 MySQL 数据库的超级管理员账号,具有最高权限; -p 表示需要输入密码才能登录数据库。...执行该命令后,MySQL 数据库会将当前会话的操作指向该数据库,此后所有的 SQL 命令都将在该数据库上执行。...主键所包含的列必须满足数据每一行都具有唯一性和非空性的条件,主键通常用于对表进行数据的查询、更新和删除操作。在表中,主键是通过具体的列值来定义的,而不是定义在表上的某个独立的约束。...唯一约束:可以确保表中某一列的值是唯一的,也可避免特定列出现空值。 非空约束:可以确保表中的某一列不为空。 检查约束:可以定义额外的规则来确保某一列或多个列的数据值符合规定。

    3.1K20

    10 分钟掌握 MySQL 的索引查询优化技巧

    不同的存储引擎具有不同的特点,用户可以根据业务的特点选择适合的存储引擎,甚至是开发一个新的引擎。MySQL的逻辑架构大致如下: ?...数据类型优化 选择数据类型的原则: 选择占用空间小的数据类型 选择简单的类型 避免不必要的可空列 占用空间小的类型更节省硬件资源,如磁盘、内存和CPU。...如果某列字符串大量重复且内容有限,可使用枚举代替,MySQL处理枚举时维护了一个“数字-字符串”表,使用枚举可以减少很多存储空间。...如果一个表没有定义主键也没有定义具有唯一索引的列,那么InnoDB会生成一个隐藏列,并且在此列设为聚簇索引列。...如果参数传入一列名或者是一个表达式,那么count会统计所有结果不为NULL的行数,如果参数是*,那么count会统计所有行数。

    97820
    领券