首页 » SEO优化 » phpvarcharchar技巧_技能进阶应该知道的数据库数据类型及其设计原则

phpvarcharchar技巧_技能进阶应该知道的数据库数据类型及其设计原则

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

整数类型

实数类型

phpvarcharchar技巧_技能进阶应该知道的数据库数据类型及其设计原则

字符串类型

phpvarcharchar技巧_技能进阶应该知道的数据库数据类型及其设计原则
(图片来自网络侵删)

日期和韶光类型

设计合理的数据类型

1. 整数类型

整数类型有:tinyint、smallint、mediumint、int、bigint,分别利用 8、16、24、32、64 位存储空间。
它们可以存储的值范围从 -2 的 (n-1) 次方到 2 的 (n-1) 次方 -1,n 是存储空间的位数。

整数有可选的 unsigned 属性(无符号类型),表示不许可有负值,因此可以使正数上限提高一倍。

有符号和无符号类型利用相同的存储空间,并具有相同的性能,因此可以根据实际情形选择得当的类型。

2. 实数类型

实数类型有:FLOAT、DOUBLE ,分别占用 4,8 字节。

如果插入值的精度(即:数字总位数)高于实际定义的精度,系统会自动进行四舍五入处理,使值的精度达到哀求。

个中 DECIMAL 也可以用来指定精度,并且它比 FLOAT 和 DOUBLE 更适宜做精确打算。
在本文就不做详细先容了,如果有人想理解的话可以给我留言,我下次再写。

3. 字符串类型

字符串类型有:

VARCHARCHARBLOBTEXT

由于 BLOB 和 TEXT 不常用且由于篇幅问题,就不展开描述了。
本文紧张对 VARCHAR 和 CHAR 进行先容,它们的差异如下表:

比拟内容VARCHARCHAR是否固定长度否是存储上限字节65535255保存或检索值时,是否删除字符串末端空格否是超过设置的范围后,字符串是否会被截断否是

除了以上不同之外,VARCHAR 还须要额外利用 1 个或 2 个字节来记录字符串长度。
如果列的最大长度小于或即是 255 字节,则利用 1 个字节,否则利用 2 个字节。

由于 VARCHAR 是变长的,以是在 update 时,可能使行变得比原来更长,这就导致须要进行额外的事情。
如果一个行占用的空间增加,并且在页内没有更多空间可以存储,在这种情形下,不同存储引擎的处理办法不一样的。
例如:MyISAM 会将行拆分为不同的片段存储,InnoDB 则须要分裂页来使行可以放进页内。

在选择利用场景上,重点要捉住 VARCHAR 是变长,CHAR 是定长的特点。

比如在这些情形更适宜利用 VARCHAR:

字符串的最大长度比均匀长度大很多;字段更新次数少(以是碎片不是问题);利用了像 UTF-8 这样繁芜的字符集,每个字符都利用不同的字节数进行存储。

而在这些情形则更适宜利用 CHAR:

存储很短的字符串(而 VARCHAR 还要多一个字节来记录长度,本来打算节约存储的现在反而得不偿失落)定长的字符串(如 MD5、uuid);须要频繁修正的字段。
由于 VARCHAR 每次存储都要有额外的打算,得到长度等事情;

这里抛出一个小问题:利用 VARCHAR(5) 和 VARCHAR(200) 来存储 ‘hello’ 的空间开销是一样的。
那么利用更短的列有什么好处呢?(思考几秒钟?)

答案:节约内存,由于更长的列会花费更多的内存。
MySQL 常日会分配固定大小的内存块来保存内部值。
尤其是利用内存临时表进行排序或操作时会特殊糟糕。
在利用磁盘临时进行排序时也同样糟糕。

以是最好的策略是只分配真正须要的空间。

4. 日期和韶光类型

下面表格是 TIMESTAMP 和 DATETIME 的一些比拟:

比拟内容TIMESTAMPDATETIME占用字节48韶光范围1970-01-01 08:00:01 ~ 2038-01-19 11:14:071000-01-01 00:00:00 ~ 9999-12-31 23:59:59存储的数据是否随时区变革是否

如果在插入数据时,没有指定第一个 TIMESTAMP 列的值,MySQL 则将这个列设置为当前韶光,同时 TIMESTAMP 比 DATETIME 的空间效率更高。

末了,网上有很多谈论,韶光到底要利用 INT、TIMESTAMP、DATETIME 哪种类型更适宜。
我认为这没有一个固定答案,得当的就好……。

5. 设计合理的数据类型

供应给大家 3 点设计原则:

更小的常日更好大略就好只管即便避免 NULL

下面对其详细解释一下:

一样平常情形下,该当选择可以精确存储数据的最小数据类型,由于它们占用更少的磁盘、内存和 CPU 缓存,并且处理时须要的 CPU 周期也更少。
大略数据类型的操作须要更少的 CPU 周期。
例如,整型比字符操作代价更低,由于字符集和校正规则(排序规则)使字符比较比整型比较更繁芜。
常日情形下,最好指定列为 NOT NULL,除非真的须要存储 NULL 值。
由于可为 NULL 的列会使索引、索引统计和值比较都更繁芜。
可为 NULL 的列会利用更多的存储空间,在 MySQL 里也须要分外处理。
当可为 NULL 的列被索引时,每个索引须要一个额外的字节,在 MyISAM 里乃至还可能导致固定大小的索引变成可变大小的索引。
常日把可为 NULL 的列改为 NOT NULL 带来的性能比较小,以是在优化时没有必要先在现有表里修正这种情形。

参考:

《高性能 MySQL》
标签:

相关文章

wsl2php技巧_若何用WSL2提升Docker机能

而且,该办理方案使开拓不受您所拥有的操作系统的约束。 简而言之,纵然您的容器是Linux映像,也可以利用Windows或Mac进行...

SEO优化 2024-12-09 阅读0 评论0

znedphp情况技巧_每 一 天 都 爱 你

如果信念有颜色,那一定是中国红。这抹红,是奔赴星辰大海的一腔热血;这抹红,是为之不懈奋斗的小儿百姓初心;这抹红,是亿万中原儿女的共...

SEO优化 2024-12-09 阅读0 评论0