zoukankan      html  css  js  c++  java
  • mysql 开发基础系列13 选择合适的数据类型(下)

    一.  BloB和Text

    1. 合成索引
      合成索引可以提高大文本字段BLOB和Text的查询性能, 合成索引是在表中增加一个字段存放散列值,这种技术只能用于精确匹配的查询,可以使用md5()或sha1,crc23() 来生成散列值, 数值型散列值可以提高存储效率 。下面演示下

    --    hash_value字段用来存储散列值
    CREATE TABLE t(id VARCHAR(100),context BLOB, hash_value VARCHAR(40))
    
    --  插入数据  存放MD5散列值
    INSERT INTO t VALUES(1, REPEAT('beijing',2),MD5(context));
    INSERT INTO t VALUES(2, REPEAT('beijing',2),MD5(context));
    INSERT INTO t VALUES(3, REPEAT('beijing 2008',2),MD5(context));
    
    SELECT * FROM t;

    --  查询context值为 beijing 2008的记录,通过散列值来查询
    SELECT * FROM t WHERE hash_value=MD5(REPEAT('beijing 2008',2));

      上面展示了合成索引的用法,这种技术只用于精确匹配,在一定程度上减少i/0,提高查询效率,如果要使用模糊查询,可以考虑使用前缀索引。

    2. 前缀索引

    --  创建前缀索引,为字段前N个字符创建索引。这里是前100个字符进行模糊查询
    CREATE INDEX idx_blob ON  t(context(100))
    -- 查看是否用到前缀索引
     DESC SELECT * FROM t WHERE context LIKE 'beiing%0'

      总结: 可以考虑把blob和text列移动到第二张数据表中,把原数据表的数据列转换为固定长度的数据行格式,减少碎片。

    二. 浮点数与定点数 

      浮点数一般用于含有小数部分的数值,当数据的精度超过该列定义的实际精度时,则插入值被四舍五入到实际定义的精度值。在mysql中 float,double(或real)用来表示。
      定点数则是以字符串形式存放的。当数据的精度超过该列定义的实际精度时,则mysql会警告(默认的sqlmode),但也是按照四舍五入。如果sqlmode 是在传统模式下则会报错,在mysql中 decimal或(numberic)用来表示。

    --  下面看下浮点数与定点数的区别
    CREATE TABLE test(c1 FLOAT(10,2),c2 DECIMAL(10,2))
    INSERT INTO test VALUES(131072.32,131072.32)
    SELECT * FROM test;

      从上面的例子看出c1列插入131072.32值,实际变成了131072.31值。这是由于单精度浮点数表示时产生了误差,在精度要求高的应用中(比如货币)要使用定点数。

  • 相关阅读:
    全栈的苦逼和崛起
    Swift内部类调用外部类方法、属性的变通
    Assets.xcassets误删后的恢复
    UITableViewCell嵌套UITableView的正确姿势
    GPU Accelerated Computing with Python
    Windows 10创意者更新ISO发布!官方下载
    Amazing iOS Tips
    self-sizing cell的一个问题
    buf.swap32()
    buf.swap16()
  • 原文地址:https://www.cnblogs.com/MrHSR/p/9269970.html
Copyright © 2011-2022 走看看