zoukankan      html  css  js  c++  java
  • 《Mysql

    一:数据类型选择标准

      - 更小的通常更好

        - 在没有低估需要存储值的范围时,选择可以正确存储数据的最小数据类型

        - 最小的数据类型通常更快,因为他们占用更少的磁盘/内存/CPU缓存,并且处理更快。

      - 简单就好

        - 简单的类型通常需要更少的CPU周期。

        - 例如  整型比字符操作代价更低 /  使用Mysql内建类型而不是字符串存储日期。

      避免使用 Null

        - Null 使得 Mysql 在 索引/统计/比较 执行优化时,行为更为复杂。

        -  而且需要更多的存储空间去保存Null.

    三:整型

      - 常用类型

      • 类型      字节  位  范围        无符号范围-2(N-1)至2(N-1)-1     无符号范围2(N)-1
        TINYINT   1    8   2的8次方    -128 — 127                    0 — 255
        SMALLINT  2    16  2的16次方   -3276 8 — 3276 7              0 — 6553 5
        MEDIUMINT 3    24  2的24次方   -8388608 - 8388607            0 - 1677 7215
        INT       4    32  2的32次方   -2147 4836 46 — 2147 4836 47  0 — 4294 9672 95
        BIGNET    8    64  很大,够用

      - 使用选择

        - 在 整型 的使用上,这些类型在很大程度上是相同的,只有它们存储的值的范围是不相同的。

        - 所以需要根据使用值 范围 来选择 整型类型

      - 关于整型宽度 (zerofill)

        - MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展(如 INT(6),6即是其宽度指示器。

        - 该宽度指示器并不会影响int列存储字段的大小,也就是说,超过6位它不会自动截取,依然会存储,只有超过它本身的存储范围才会截取;此

        - 处宽度指示器的作用在于该字段是否有zerofill,如果有就未满足6位的部分就会用0来填充

        - 注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

        - 设置一个字段为 zerofill 那么它必然是 unsigned 的

      • // 创建字段
        mysql> create table `demo` ( `num` tinyint(4) zerofill); Query OK, 0 rows affected (0.03 sec) // 查看字段属性
        mysql
        > desc demo; +----------+------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------------------+------+-----+---------+-------+ | num | tinyint(4) unsigned zerofill | YES | | NULL | | +----------+------------------------------+------+-----+---------+-------+ 1 row in set (0.00 sec)
        // 插入数据 mysql
        > insert into demo values (1); Query OK, 1 row affected (0.00 sec) // 查看数据 (宽度补充) mysql> select * from demo; +------+ | num | +------+ | 0001 | +------+

    四: 浮点型(如果可以,请尽量使用整数来表示浮点数值)

      - 常用类型

      • 类型                占用(字节)
        FLOAT(M,D)          4
        DOUBLE(M,D)         8
        DECIMAL(M, D)       M+2 字节 默认为(100)
        
        M 表示可以显示多少位数字(数字+小数点)
        D 位于小数点后,又称 精度/标度
          (数据的精度总是能精确到D位,也就是数据的不精确一定出现在小数点后)
          (数据存储的时候只能存储到D位小数)
        超出的位,Mysql会四舍五入进行保存  

      - 使用选择

        - 对于精度准确度要求不高浮点数存储可以使用 float

          - float/double 不准确在于,在 Mysql 中,数据精确度取决于分配给数据结构的长度。在按照长度进行二进制转换时候,就会造成数据的不不准确。

          - double 和 float 的区别double 精度高,有效数字 16 位,float 精度 7 位。

          - 但 double 消耗内存是 float 的两倍,double 的运算速度比 float 慢得多,

          - SO,能用 float 时不要用 double(以省内存,加快运算速度)。

        - 如果需要存储一个准确的 浮点数 ,使用 DECIMAL

          - 但是 DECIMAL 存储长度最大为 65.

          - 如果需要更大精度,可以使用 字符串 存储

        - 《MySQL如何选择float, double, decimal》

    五:字符串

      - 常用类型

      • 类型            占用(字节)     
        char(n)         3 * n
        varchar(n)      3 * 实际
        BLOB
        TEXT

      - 使用场景

        - CHAR

          - CHAR善于存储经常改变的值,或者长度相对固定的值,比如type、ip地址或md5之类的数据,由于 char 定长 不容易产生碎片。

          - 比如CHAR(30)能放30个字符,存放abcd时,尾部会以空格补齐,实际占用空间 30 * 3bytes (utf8)。检索它的时候尾部空格会被去除。

        - VARCHAR

          -  VARCHAR善于存储值的长短不一的列,也是用的最多的一种类型,节省磁盘空间。

        - BLOB(不建议使用)

          - 可以存储二进制,照片等( 会引起一些性能问题)

        - TEXT(不建议使用)

          - 只能保存字符,日记( 会引起一些性能问题)

      - CHAR 和 VARCHAR 的区别

        - 使用对比

          - Char 的最大长度为 0-255 字符,Varchar 收到最大行长度的限制,行最大为 65535 字节。

          - Char 会自动去除行尾空格。(如果字段设置了 unqiue, 那么在空格去除之后,也会引起冲突)

        - 内存对比

          - Char 是固定长度,处理速度会比 Varcahr 快一些,但同时 Char 会浪费存储,程序需要对空格做出处理.

          - Varchar 可变长度,在使用时也需要不要直接给一个大值。因为在Mysql内部分配内存时候,也会根据默认值分配内存。

        - 场景对比

          - 对于长度变化不大,对于查询速度有较高要求的选用 Char, 可变长选用 Varchar.

        - 储存方式对比

          - 《MySQL - 行模式》

    六:日期类型

      - 常用类型

      • 类型                保存信息             占用(字节)
        DATE                年月日              4
        DATETIME            年月日时分秒         8
        TIME                时分秒              3
        TIMESTAMP           年月日时分秒         4
        YEAR                年                 1

      - 使用场景

        - DATE/DATETIME/TIME 由于其存储信息不同,所以根据需要保存内容选择

          - 由于 TIMESTAMP 支持时间太小(至 2038年), 所以时间存储尽量使用 DATETIME

        - 如果只想保存年份,使用 YEAR    

  • 相关阅读:
    android基本架构
    c#编辑框只接受数字
    listbox数据源绑定问题
    QQ在线客服代码
    用VB生成DLL封装ASP代码例子
    C#,关于DataGridView的一些方法
    转:ASP.NET中引用dll“找不到指定模块"的完美解决办法
    编译asp.net文件为dll文件
    好看的表格样式
    网站IIS日志解读
  • 原文地址:https://www.cnblogs.com/25-lH/p/10442744.html
Copyright © 2011-2022 走看看