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 、即使它比较调皮、例如和时区相关

MySQL数据类型的最优选择的更多相关文章

  1. 谈谈如何选择合适的MySQL数据类型

    MySQL数据类型选择 一 .选择原则 更小的通常更好:一般情况下选择可以正确存储数据的最小数据类型.越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小. 简单就好:简单的数据类型的操作通常需要更 ...

  2. MySQL数据类型的选择

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据类型的选择时间:2019年2月22日内容:MySQL数据类型的选择范式参考重点:主要讲述MyS ...

  3. Mysql 数据类型及选择原则

    MySQL中的数据类型大的方面来分,可以分为:日期和时间.数值,以及字符串.下面就分开来进行总结. 数据库类型的选择对数据库的性能影响很大 1 . 数据类型会影响存储空间的开销 2 . 数据类型会影响 ...

  4. 如何选择合适的MySQL数据类型

    一.MySQL数据类型选择原则 更小的通常更好:一般情况下选择可以正确存储数据的最小数据类型.越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小. 简单就好:简单的数据类型的操作通常需要更少的CP ...

  5. MySQL 基础数据类型优化(如何选择数据类型)

    前言:      最近在看高性能 MySQL,记录写学习笔记:           高性能 MySQL 学习笔记(二) Schema与数据类型优化      笔记核心内容:MySQL 如何选择正确的数 ...

  6. MySQL 数据库规范--调优篇(终结篇)

    前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...

  7. mysql 数据类型

    1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) mediumint(m) ...

  8. MySQL 数据类型 详解

    MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My ...

  9. MySQL数据类型——数值类型

    1.1.1 整型 整型 占用字节 范围 范围 tinyint 1 -27~27-1 -128~127 smallint 2 -215~215-1 -32768~32767 mediumint 3 -2 ...

随机推荐

  1. C# .net 使用rabbitmq消息队列——EasyNetQ插件介绍

    EasyNetQ 是一个简洁而适用的RabbitMQ .NET类库,本质上是一个在RabbitMQ.Client之上提供服务的组件集合.

  2. MongoDB分片集群机制及原理

    1. MongoDB常见的部署架构 * 单机版 * 复制集 * 分片集群 2. 为什么要使用分片集群 * 数据容量日益增大,访问性能日渐下降,怎么破? * 新品上线异常火爆,如何支撑更多用户并发? * ...

  3. go语言生成markdown文档工具

    虽然有go语言的swagger,但是go版本的swagger对代码的侵入比较大,因此抽空实现了基于GO语言生成markdown文档的工具 开源链接地址: https://github.com/w3li ...

  4. MyBatis 一级缓存实现详解及使用注意事项

    一级缓存介绍 在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对 ...

  5. mutation中修改state中的状态值,却报[vuex] do not mutate vuex store state outside mutation handlers.

    网上百度说是在mutation外修改state中的状态值,会报下列错误,可我明明在mutations中修改的状态值,还是报错 接着百度,看到和我类似的问题,说mutations中只能用同步代码,异步用 ...

  6. Linux系统使用SSH登录之前如何显示横幅消息

    OpenSSH有一个名为Banner的内置选项.在允许身份验证之前,将指定文件的内容发送给远程用户.如果Banner选项设置为none,那么在ssh登录时就不会显示任何Banner消息.默认情况下,不 ...

  7. Clickhouse的MergeTree表引擎存储结构

    MergeTree存储的文件结构 一张数据表被分成几个data part,每个data part对应文件系统中的一个目录.通过以下SQL可以查询data parts的信息. select table, ...

  8. 学习笔记--我的第一个Java程序

    我的第一个Java程序 // pubilc 表示公开的 // class 表示定义一个类 // HelloWorld 表示一个类名 public class HelloWorld { // 表示定义一 ...

  9. Anaconda3+CUDA10.1+CUDNN7.6+TensorFlow2.6安装(Ubuntu16)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. Python网络编程之网络基础

    Python网络编程之网络基础 目录 Python网络编程之网络基础 1. 计算机网络发展 1.1. OSI七层模型 1.2. 七层模型传输数据过程 2. TCP/IP协议栈 2.1 TCP/IP和O ...