视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL数据类型的最优选择_MySQL
2020-11-09 18:36:48 责编:小采
文档
 bitsCN.com

MySQL数据类型的最优选择

慎重选择数据类型很重要、为啥哩?可以提高性能、原理如下:

● 存储(内存、磁盘)、从而节省I/O(检索相同数据情况下)

● 计算、进而减负CPU负载

数据类型总体可分三种:数字、字符和时期

㈠ 数字

① 分类

② 为整数类型指定宽度没啥意义、硬说呢、大概也是为了显示字符的个数、人性化点

因为、对于存储和计算而言、INT(1)和INT(100)是相同的

③ 对于浮点、建议只指定数据类型、而不要指定精度

④ 对于定点、尽量只在对小数精确计算时才使用、如存储财务数据

但天朝某些财务软件在其数据库内使用float作为工资类型

赤裸裸的资本家的丑恶展现、鄙视!!!

⑤ 在数据量较大时、建议把实数类型转为整数类型

原因很简单:

● 浮点不精确

● 定点计算代价昂贵

例如:

要存放财务数据精确到万分之一、则可以把所有金额乘以一百万、然后存在BIGINT下

㈡ 字符串

① 分类

② 数据如何存储取决于存储引擎

char和varchar在不同引擎在内存和磁盘可能是不一样的

不过、对于char、在填充和截取上是一样的、因为、

这部分是在Server层完成的

③ 常见 char 使用场景

● 很短的字符串或所有值都接近同一个长度、如存储密码的MD5值

● 经常变更的列、因为char产生的碎片少

● 非常短的列、如性别、char(1)的效率更好、毕竟varchar(1)浪费了1一个字节

④ 和字符集的那点猫腻

CSDN 有个讨论非常热的帖子:有人认为unicode跟utf-8是等同的吗? 点击看讨论贴

我赶脚、这其实没啥好讨论的、因为、这两个根本就是两回事

Unicode 是字符编码

utf8 是字符集

对Unicode编码的字符集、墙裂建议使用varchar

显然、utf8 也是Unicode 编码的、而且、随着国际化趋势、utf8 是首选

那么、结果是、在char 和 varchar 竞争里、varchar 便是最大赢家

可通过下列方法查看MySQL Unicode支持的字符集以及当前的字符集

[plain]

mysql> select CHARACTER_SET_NAME from character_sets

-> where DESCRIPTION like '%Unicode%'/G;

*************************** 1. row ***************************

CHARACTER_SET_NAME: utf8

*************************** 2. row ***************************

CHARACTER_SET_NAME: ucs2

*************************** 3. row ***************************

CHARACTER_SET_NAME: utf8mb4

*************************** 4. row ***************************

CHARACTER_SET_NAME: utf16

*************************** 5. row ***************************

CHARACTER_SET_NAME: utf32

5 rows in set (0.06 sec)

mysql> status;

--------------

mysql Ver 14.14 Distrib 5.5.16, for Linux (i686) using EditLine wrapper

Connection id: 1

Current database: information_schema

Current user: root@localhost

SSL: Not in use

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server version: 5.5.16-log Source distribution

Protocol version: 10

Connection: Localhost via UNIX socket

Server characterset: latin1

Db characterset: utf8

Client characterset: utf8

Conn. characterset: utf8

UNIX socket: /tmp/mysql.sock

Uptime: 2 min 9 sec

⑤ 对于InnoDB 建议使用varchar

现在很多场合都使用了InnoDB、算下来、varchar 又赢了

⑥ 存储大数据

● BLOB:采用二进制存储、没有字符集或排序规则

● TEXT:采用字符方式存储、有字符集和排序规则

最好尽量避免使用这两、如果可以、可以把BLOB货TEXT 列分离成单独的表

对于使用了BLOB或TEXT大量删除或更新时、

建议定期使用 optimize table 碎片整理

㈢ 日期和时间类型

常见的有 datatime、timestamp 和 date

从存储上看、timestamp 占 4 个字节、其他两个 8 个字节

所以、若无意外、最好尽量使用 timestamp 、即使它比较调皮、例如和时区相关

bitsCN.com

下载本文
显示全文
专题