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值。这是由于单精度浮点数表示时产生了误差,在精度要求高的应用中(比如货币)要使用定点数。

  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/MrHSR/p/9269970.html
Copyright © 2011-2022 走看看