`

对于大字段的处理,可以采用分表

 
阅读更多

在数据库中,经常需要用到大字段类型,如oracle中long/blob/clob,sqlserver中text/image,mysql中的text/longtext/clob/blob。
  那么假如现在有一个表,记录某人发布的文档信息,字段包括:发布人,发布时间,文档标题,文档内容(实际中还会有其它字段),一般建表如下(sqlserver):
create table document(
id int identity(1,1) not null,
createuser_id int,
document_title varchar(255),
document_context text);

这张表的结构,表面上看起来,从数据库设计角度和对应的JAVA类的设计来讲,都是没有问题的。

但实际上,这里面隐藏着两个比较严重的问题!

一、不能完全跨数据库
  why?问题出在需要查重(distinct)的时候。
  在需要查重时,采用纯jdbc技术,则可以自定义要查重的字段,如select distinct id,createuser_id,document_title from document。而当采用hibernate时,若不想自已创建若干个新的Pojo或者使用Object[]方式来处理数据,则只能使用select distinct d from document as d这样的语句,而hibernate会将其解析为类似:select distinct id,createuser_id,document_title,document_context from document。
  问题就出在这个document_context字段上!
  对于mysql来讲,hibernate生成的sql是可以执行的。但对于sqlserver来讲,是不允许在text/image列上进行distinct查询的!oracle中同样不可以对clob/blob进行distinct查询。
  因此系统在sqlserver/oracle上部署时,当需要查重时则会出错。当然如果你用不到查重语句,是一点不受影响的。
二、严重影响列表显示和统计的效率
  影响一张表的查询速度的,除了行数,还包括表所占的物理空间的大小。此表在数据量较小时,在查询方面感觉不到明显的差异。但是如果document_context字段所存储的数据都是大段文本或较大的文件时,会导致表的物理空间迅速变大,该字段所占用的空间有可能达到整表所占空间的90%以上。在此基础上,如果行数再增加到数十万、上百万级时,整个表所占的空间将达到一个惊人的数字。
  保守估计,一条记录占用的空间平均为10K的话,一万条记录将占用100M的空间,一百万条记录将占用10G!在此表上的CRUD操作,亦将变慢,查询的速度亦会受到非常大的影响 。当然通过提高服务器本身的硬件性能和优化索引,可以提高查询速度,但面对无法预知的巨大洪水,单纯加固堤坝是不保险的。

解决的方式?
  曾经处理过公司内的一个老系统,表的行数达到十万左右,由于采用上面的设计方式,虽然已经尽可能优化了索引,但查询分页时,仍然需要十秒左右。我单独建了一个新表,将document_context这个字段移到新表中,在原表中加一个对应的外键列,经过处理后,分页显示响应时间降到毫秒级以内。(二进制数据的转移是无法使用普通 的数据导入导出方式的,我的方法是复制该表,然后再修改复制后的表结构)
  因为这个大字段,在最常用的列表显示中是根本不需要关心的,仅当用户需要查看某一记录的具体信息时,才需要调入该字段信息。因此分表后,显著提高了分页性能。

在我现在开发的所有的系统中,我都采用了上述的方式,这样做属于未雨绸缪,一旦系统部署后再修改,可能就来不及了。

分享到:
评论

相关推荐

    大数据表的分表处理设计思想和实现(MySQL)

    1. **性能提升**:大型表在执行SQL时,由于数据量大,索引扫描和数据读取都会变慢,分表可以将数据分布到多个物理存储上,加快查询速度。 2. **负载均衡**:通过分表,可以将数据分散到多个服务器,实现负载均衡,...

    分表_利用python进行数据表分表_

    6. **错误处理和日志记录**:在实际操作中,应添加错误处理代码,如捕获并处理可能出现的IO异常,同时记录分表过程中的详细信息,以便于后期问题排查。 7. **自动化脚本**:将以上步骤整合到一个Python脚本(如`...

    数据分库分表之二叉树分库分表

    ### 数据分库分表之二叉树分库分表 #### 一、引言与背景 随着互联网技术的快速发展及用户需求的激增,单一...对于需要处理大量数据的企业而言,合理设计并实施二叉树分库分表方案,能够显著提升系统的性能和稳定性。

    kettle对数据分表插入

    总的来说,结合Kettle、Oracle数据库、Java脚本和哈希算法,我们可以构建出一个高效的数据分表插入解决方案,这对于大数据环境下的数据处理和分析具有重要意义。在实际工作中,理解并掌握这些技术,将有助于提升数据...

    msyql分表sql,导入即可

    MySQL数据库在处理大数据量时,为了提高查询性能和负载均衡,常常采用分表(Sharding)策略。这里的“msyql分表sql,导入即可”指的是利用特定的SQL语句来实现MySQL数据库的分表操作,并且这些SQL脚本可以直接导入到...

    Excel的繁杂数据处理,以列为名分表

    通过上述介绍可以看出,“以列为名分表”技术是一种非常实用的数据处理方法,它不仅能够帮助我们快速地将复杂的数据集拆分成易于管理的小部分,还能提高数据分析的效率和准确性。掌握了这一技能,我们就能更加从容地...

    MySQL分表及分表后插入sql

    MySQL分表及分表后插入sql语句,表为订单表,可以参考一下

    数据库分库分表

    随着互联网应用的发展,单个数据库往往难以承受日益增长的数据量和用户访问压力,这时就需要采用分库分表来优化数据库架构。 **分库** 是将一个大的数据库拆分成多个独立的数据库,每个数据库处理一部分数据,以此...

    hibernate动态分表

    最后,从源码角度理解Hibernate动态分表,可以查看Hibernate的SessionFactoryBuilder、SessionFactory、Session等核心类,它们在处理实体持久化时会调用到与分表相关的代码。对于自定义的分表策略,可能涉及到...

    TP5+MySQL通用分表代码

    - 分表情况,2:日期分表,按照目标表里面的记录日期的字段,按照日期【日、周、月、年】拆分成多个表【本代码仅考虑unix时间戳来分表,其它不支持,您可以自己思考,自己修改代码】 - 注意,支持【子表】,填入...

    分表 JAVA 分表例子,带SQL文件

    在IT行业中,数据库分表是一种常见的优化策略,用于解决大数据量和高并发场景下的性能问题。本示例主要探讨了如何使用...理解并掌握数据库分表对于提升大型系统的性能至关重要,是每一个Java开发人员必备的技能之一。

    sharding-jdbc按月分表样例2

    6. **分布式事务**:Sharding-JDBC提供了基于X/Open XA的分布式事务管理,可以处理跨分片的事务一致性问题,保证数据的准确性和完整性。 7. **实战解析**:在“sharding-jdbc-demo”中,我们可以通过查看源码理解...

    sharding-jdbc按月分表样例

    通过学习和理解这个"sharding-jdbc按月分表样例",开发者可以了解到如何利用Sharding-JDBC实现动态分表,优化数据库性能,同时也能掌握Sharding-JDBC的基本使用方法,为实际项目中的数据分片提供参考。

    springmvc +mybatis采用策略设计模式基于拦截器实现按年分表

    分表是数据库优化的一种手段,尤其是对于大数据量的应用,通过将数据分布在多个表中,可以降低单表的大小,提高查询速度。在本项目中,分表策略可能基于年份,将每年的数据存储在一个单独的表中,这有助于优化查询...

    对分库分表的一些想法

    为了保证数据一致性,可以采用分布式事务,例如两阶段提交或Saga模式。跨库跨表的事务处理需要精心设计事务边界,确保业务逻辑的完整。至于联合查询,由于数据分布在不同的库表中,通常需要借助中间件或自定义的路由...

    Python+MySQL分表分库实战

    对于分表分库,Python可以编写脚本自动执行数据迁移、表结构同步和数据分布计算等任务。 1. **Python操作MySQL**:`pymysql`库提供了一系列API,如`connect()`建立连接,`cursor()`创建游标,`execute()`执行SQL...

    MySQL分库分表技术

    1. **电商系统**:面对大量商品、订单和用户数据,采用分库分表技术可以有效提高系统处理能力,保证购物节等活动期间的稳定运行。 2. **社交网络**:用户消息、朋友圈等海量数据,通过水平分表减少单表数据量,提高...

    oracle 查询从分表取数据

    一个简单的oracle数据库环境下的存储过程,介绍了如何从带年月人的分表取数据

Global site tag (gtag.js) - Google Analytics