zoukankan      html  css  js  c++  java
  • mysql 的大文本存储TEXT & BLOB

    TEXT & BLOB

    一般在保存少量字符串的时候,我们会选择 CHAR 或者 VARCHAR;而在保存较大文本时,
    通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB 能用来保存二进制数据,比
    如照片;而 TEXT 只能保存字符数据,比如一篇文章或者日记。TEXT 和 BLOB 中有分别包括
    TEXT、MEDIUMTEXT、LONGTEXT 和 BLOB、MEDIUMBLOB、LONGBLOB3 种不同的类型,它们
    之间的主要区别是存储文本长度不同和存储字节不同,用户应该根据实际情况选择能够满足
    需求的最小存储类型。

    BLOB 和 TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时.
    可以使用合成的(Synthetic)索引来提高大文本字段(BLOB 或 TEXT)的查询性能;

    如果散列算法生成的字符串带有尾部空格,就不要把它们存储在 CHAR 或 VARCHAR 列中,它们会受到尾部空格去除的影响。合
    成的散列索引对于那些 BLOB 或 TEXT 数据列特别有用。用散列标识符值查找的速度比搜索BLOB列本身的速度快很多。

    create table t_synthetic (id varchar(100),context blob,hash_value varchar(40));

    insert into t_synthetic values(1,'beijingbeijing',md5(context));

    insert into t_synthetic values(2,repeat('beijing',2),md5(context));

    insert into t_synthetic values(3,repeat('beijing 2008',2),md5(context));

    SELECT * from t_synthetic where hash_value = MD5(repeat('beijing',2));


    合成索引的用法,由于这种技术只能用于精确匹配,在一定程度上减
    少 I/O,从而提高查询效率。如果需要对 BLOB 或者 CLOB 字段进行模糊查询,MySQL 提供了
    前缀索引,也就是只为字段的前 n 列创建索引,举例如下

    CREATE INDEX idx_blob ON t_synthetic(context(100));

    desc select * from t_synthetic where context like 'beijing%'


    在不必要的时候避免检索大型的 BLOB 或 TEXT 值。

    把 BLOB 或 TEXT 列分离到单独的表中。


    总结;
    对于字符类型,要根据存储引擎来进行相应的选择。
    对精度要求较高的应用中,建议使用定点数来存储数值,以保证结果的准确性。
    对含有 TEXT 和 BLOB 字段的表,如果经常做删除和修改记录的操作要定时执行
    OPTIMIZE TABLE 功能对表进行碎片整理。
    日期类型要根据实际需要选择能够满足应用的最小存储的日期类型。

  • 相关阅读:
    【Blazor】在ASP.NET Core中使用Blazor组件
    Github和Azure DevOps的代码同步
    【.NET Core】在Win10中用VS Code debug
    【UWP】利用EF Core操作SQLite
    【ASP.NET Core】mdl conflicts with tinymce
    【Windows10】如何使用Segoe MDL2 Assets图标
    Docker安装及使用,Docker 安装MySQL、安装Tomcat、安装RabbitMQ
    Anaconda安装常用配置及命令
    MySQL获取周、月、天日期,生成排序号
    Linux常用查询命令
  • 原文地址:https://www.cnblogs.com/pangdajin/p/9541707.html
Copyright © 2011-2022 走看看