数据类型的选择
    1.CHAR与VARCHAR
 
        存储/检索的方式不同.
        CHAR是固定长度,而VARCHAR是可变长度
        非SQLMode下,超过指定长度,会做截取操作.SQLMode模式下,会报错
        'adcdefgh'插入到CHAR(4)和VARCHAR(4)中,前者需要4字节,后者需要5字节,结果都是非SQLMode下 存储了'abcd'  todo 为什么VAR(4) 需要5字节??
        CHAR会去掉尾部的空格,VARCHAR则不会.
        CHAR处理速度快,但浪费存储空间,对长度变化不大,且对查询速度有较高要求的推荐使用CHAR
        VARCHAR 随着MySQL的不断升级,性能也在不断提高,许多应用用使用VARCHAR.
        不同引擎对CHAR和VARCHAR的使用原则不同:
            MyISAM : 建议使用固定长度代替可变长度,因此推荐CHAR
            MEMORY : 无论使用CHAR或VARCHAR都默认处理成固定长度的数据存储.
            InnoDB : 建议使用VARCHAR .内部存储格式没有区分固定长度/可变长度.性能因素主要是数据行使用的存储总量.CHAR的平均空间大于VARCHAR ,用VARCHAR进行存储和磁盘I/O比较好.
 
 
    2.TEXT与BLOB
 
        少量字符串选择CHAR/VARCHAR,大文本选择TEXT/BLOB.
        二者之间的区别是,BLOB可以用来保存二进制数据,比如照片;而TEXT只能保存字符数据,比如文章/日记.
        TEXT/BLOB 会引发性能问题,特别是在执行了大量的删除操作时.
        删除操作会在数据表中留下很大的"空洞",对日后插入操作的性能上有影响.
        为了提高性能,建议定期使用OPTIMIZE TABLE 对这类表进行碎片整理.
        查看表的物理文件大小:
            du -sh tbl_name.* ;
        经测试,即使进行了删除操作,表的物理大小并没有减少.
            OPTIMIZE TABLE tbl_name ;
        优化后发现物理文件减小了.
        
        可以使用合成的(Syntheic)索引来提高TEXT/BLOB的查询性能.
        合成索引就是根据大文本的内容建立一个散列值,并把该值存储到一个单独的数据列中.接下来就可以通过它进行查找数据.
        注意,该方式只能对精确查找的方式进行优化,而类似于< , >= 这种范围查找没有用处.
        散列值可以通过MD5(),SHA1(),CRC32()等方式生成,也可以使用自己的应用程序逻辑来计算散列值.
        数值型的散列值可以很高效的存储.如果生成的散列值尾部有空格,就不要存储到CHAR/VARCHAR列中.  todo 为什么VARCHAR 也不行,VARCHAR不是不对尾部空格进行处理么??
        
        Demo:
            CREATE TABLE t (id VARCHAR(100) , context BLOB , hash_value VARCHAR(40) ;
            INSERT INTO t VALUES(1,REPEAT('beijing',2),MD5(context));
            SELECT * FROM t where hash_value=MD5(repeat('beijing 2008',2));
 
        如果要使用模糊查询,MySQL提供了前缀索引,也就是只为字段的前n列创建索引.
        Demo:
            CREATE INDEX idx_blob ON t (context(100)); --为context的前100个字符创建索引.
            DESC SELECT * FROM t WHERE context LIKE 'beijing%' ; --'%'不能放在最前面,否则索引不起作用.
 
        注意:
            避免在不必要的时候检索大型的BLOB/TEXT.除非WHERE字句可以精确匹配到哪一行.
            推荐使用索引进行检索,决定需要哪些数据行,然后从这些数据行中检索BLOB/TEXT的值.
            把BLOB/TEXT列分离到单独的表中.减少主表中的碎片,也不会在SELECT * 进行查询时是一哦那个网络传输大量的BLOB/TEXT 值.
 
 
    3.浮点数与定点数
 
        浮点数,当精度超过实际定义的精度,会四舍五入,并不会报错.
 
        定点数,实际是以字符串形式存放的,所以定点数可以更加精确的保存数据.
            默认的SQLMode下会报警,但是还是会四舍五入进行保存;在传统模式(TRADITIONAL)的SQLMode下,会报错,无法插入.
 
        浮点数,比如使用单精度float(10,2) 插入2.32 , 可能插入结果是2.31 ,所以浮点数会产生误差,这是浮点数特有的问题
        因此精度要求比较高的场景,比如金融/货币,要使用定点数.
        浮点数的比较也是一个普遍问题.编程中,尽量避免浮点数的比较,如果非要比较,也最好使用范围比较,而不是 '=='
        
        Java中把浮点数转化为BigDecimal,在进行比较:
            BigDecimal b1 = new BigDecimal(Double.toString(d1));
            BigDecimal b2 = new BigDecimal(Double.toString(d2));
            b1.subtract(b2).doubleValue();
 
 
    4.日期类型的选择
        根据场景,选择最小的存储日期类型.
            如果只需要"年份",则使用1字节来存储YEAR类型,而不需要用4字节来存储DATE类型.
            如果记录的年份比较久远,使用DATETIME , 而非TIMESTAMP.
            如果记录的日期要让不同时区的用户使用,最好使用TIMESTAMP                    
     

05 MySQL数据类型的选择与使用的更多相关文章

  1. MySQL数据类型的选择

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

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

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

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

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

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

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

  5. MySQL数据类型的最优选择

    MySQL数据类型的最优选择   慎重选择数据类型很重要.为啥哩?可以提高性能.原理如下:            ● 存储(内存.磁盘).从而节省I/O(检索相同数据情况下)      ● 计算.进而 ...

  6. mysql数据库从删库到跑路之mysql数据类型

    一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data ...

  7. Python 3 mysql 数据类型

    Python 3 mysql 数据类型 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/m ...

  8. mysql 数据类型

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

  9. MySQL 数据类型 详解

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

随机推荐

  1. The way get information from mssql by using excel vba and special port

    Yes,  we can get information from mssql by using excel vba.  But the default port of MSSQL is  1433. ...

  2. uniGUI之TUniHiddenPanel(14)

    TUniHiddenPanel是将不在界面上显示的  容器  控件.  只有uniDBGrid实际列才有对应的编辑控件,如果是外键列则无法设置 编辑控件. 里面的控件将不会 显示.将控件放入其中即可. ...

  3. js去后台传递的值

    function test(){ var param = [[${list}]];//以集合为例 } 如果list里面是实体类那么就需要重写toString,或者转为json

  4. C#学习之time控件和timer_tick事件 -----转载

    Timer控件:Timer控件只有绑定了Tick事件,和设置Enabled=True后才会自动计时,停止计时可以用Stop()控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来 ...

  5. 【剑指Offer面试编程题】题目1516:调整数组顺序使奇数位于偶数前面--九度OJ

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...

  6. 安装 primecoin 矿池

    壹.安装 boost_1_49_0. 一.官网下载:https://www.boost.org/users/download/ 前期准备:boost中,用到了别的函数库,所以为了使用boost中相应的 ...

  7. Spring和SpringMVC的直接

    1.Spring的常用注解 2.SpringMVC的常用注解

  8. ubuntu16.04 使用tensorflow object detection训练自己的模型

    一.构建自己的数据集 1.格式必须为jpg.jpeg或png. 2.在models/research/object_detection文件夹下创建images文件夹,在images文件夹下创建trai ...

  9. 库克承认iPhone销售不佳是因定价太高,但降价能救苹果吗?

    iPhone定价愈来愈高,已经是不争的事实.但iPhone价格的飙升,其实并不是"正常"的.早在乔布斯时代,iPhone的价格维持在5000元左右.虽然看起来价格略高,但也在很多人 ...

  10. Java-Study

    java中static用法: static :静态的,用于修饰成员(成员变量,成员方法): 1. 被static所修饰的变量或者方法会储存在数据共享区: 2. 被static所修饰的成员变量只有一份: ...