`
songzi0206
  • 浏览: 158886 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
Group-logo
All are from ...
浏览量:33820
Group-logo
Programming w...
浏览量:19688
社区版块
存档分类
最新评论

小小的重构,大大的认识

阅读更多
    作为开发人员,一直把重点关注在技术架构、代码、并发效率上,却从来没有认真仔细的虑数据库,昨天、今天做了一次小小的重构,顺便学习了一下MySql,发现这里大有搞头。小记一下这个过程,便于今后查阅。
    这是一个搜索系统,搜索引擎这边直接将数据库数据增量索引到索引库,提供给公司内部其他系统进行搜索,到没有出现性能问题。但是在搜索管理系统中,和数据库打交道比较多,中央-驻地二级管理运行模式,使得跨库事务、业务逻辑相对复杂一些,也出现一些较长的延迟等待。当初数据库是直接根据对象关系自动生成,由于开发紧迫,没有深究。
    首先,当初对象关系 Info 和 Keyword做双向为one-to-many,即:
    info中 <set name="keywords" cascade="all">
              <key column="info_id" not-null="true" />
                <one-to-many class="Keyword"/>
            </set>
    在keyword中<many-to-one name="info"  column="info_id" insert="false" update="false" class="Info" />
    其次,在Info的类型、子类型、目标类型等都作为many-to-one维护。但是,有一个垂直分类p_type仅仅作为Info的一个String维护着。
    然而,业务部门却非常关注这个p_type,最近上一个关键字统计模块,主要功能:
1) 根据p_type分类统计每一种p_type的节目数(info作为model的基类)、keyword数目,tag数
2) 统计总的节目数、keyword数目,tag数
3) 针对具体某一种p_type列出其下面得各keyword,以及该keyword出现频率
4) 两两比较不同p_type之间相同的keyword数,以及这些具体的keyword
    不算太复杂,但是纯用hibernate HQL肯定无法做的很好了,所以这边我直接用SQL,却发现数据库其实连3范式都算不上,这里只记一下keyword和info。
     info表大概21W行,keyword大概48W行,关系就维护在keyword中列(info_id),select distinct一下,发现keyword实际不同的关键字只有9W行,这多出来39W冗余数据啊;
     p_type作为varchar字段,在info中没有索引。
     于是进行了一下小小的改动:
1)新建temp_key(id,keyword),从keyword中select distinct插入到temp_key
2)相比keyword,temp_key量小,故为其keyword列临时建一个索引,便于后续操作更快 
3)新建数据库 info_key来维护info和keyword的关系
  ps:这里表类型需InnoDB,myisam不支持后面建外键操作
4) 删除keyword中重复记录的信息,原先的库结构会使得同一个info可能有相同的keyword记录,这是不必要的冗余,且会使得第六步info_key关系的插入受到阻扰。然而用语句:delete from keyword where id in (select id from keyword group by info_id,keyword having count(*)>=2),会有错误,原因是MySql中的行锁,在后半段select中锁定了keyword的行,在前半段却要做删除,当然不行,所以得用个临时表。
5)临时表:
create table temp_table(id bigint);
  insert into temp_table (id) (select id from keyword group by info_id,keyword having count(*)>=2)
删除:
delete from keyword where id in(select id from temp_table)
6)插入info,keyword的关联信息,info_key
insert into info_key (info_id,key_id) (select k.info_id,t.id from keyword k inner join temp_key t on k.keyword = t.keyword)
7)删掉keyword表,rename表temp_key为keyword
8)为info_key增加外键信息,当然是分别restrict到info和keyord的id
9)新建p_type(id,p_type),InnoDB
10)insert into p_type(p_type) (select distinct p_type from info)
11)为info新增列p_type_id bigint
12) update info set p_type_id = (select id from p_type where info.p_type = p_type.p_type);
13) 删除info中p_type
14)为info的p_type增加外键信息,关联到p_type.id
     经过以上小手术,关键字统计模块的性能比原先确实提高不少,最长的交叉比较大概也就15m,而原先会长时间不响应。当然这种改动的代价非常大,直接导致管理系统的更改,搜索引擎系统的对象映射等也受到了一些冲击。
     下午又进行MySQL培训,感觉数据库确实博大精深,虽然并不是DBA,也无意忘这个方向发展,但是作为开发人员,以后也要在这个方面提高一下了。
   
分享到:
评论

相关推荐

    【EMD重构】.rar_EMD重构函数_IMF变量重构_tomorrowi4n_模态分解_重构

    标题中的"【EMD重构】.rar"指的是包含EMD重构过程的压缩文件,而"EMD重构函数"是指在处理EMD分解后的IMF分量时使用的特定函数。"IMF变量重构"则是指将分解得到的各个IMF重新组合成原始信号的过程。"tomorrowi4n"可能...

    重构_重构_改善既有代码_

    《重构:改善既有代码设计》是一本由Martin Fowler所著的经典IT著作,它详细阐述了在软件开发过程中如何通过重构来提升代码质量、可读性和维护性。重构是一种系统性的方法,旨在不改变软件外在行为的前提下,改进其...

    重构-改善既有代码的设计

    因此,我利用空余时间制作了这样的一本中文的chm版重构,希望对大家有所帮助,也算对中国软件业做出一点小小的贡献。 本书基本上是取自”重构”中文版一书的内容,但格式上参照的是chm英文版的格式,还有一些格式小...

    重构(Refactoring)英文版

    ### 重构(Refactoring):改善现有代码的设计 #### 一、重构概念解析 重构(Refactoring)是一种软件工程中的重要技术,它指的是在不改变软件系统外部行为的前提下,通过改进其内部结构来提高代码质量的过程。重构...

    27丨理论一:什么情况下要重构?到底重构什么?又该如何重构?1

    重构是软件开发过程中的一个重要环节,它涉及到代码的优化、设计改进和质量提升,而不改变程序的外部行为。本文将详细探讨重构的目的、对象、时机和方法,帮助开发者理解和掌握重构的核心理念。 **重构的目的(Why...

    软件重构技术(重构介绍、重构原则、代码的坏味道。。。)

    在实践中,我们可以借助一些工具,如IDE的重构功能(如Eclipse、IntelliJ IDEA等)来进行自动化重构,这可以大大提高效率并减少出错的可能性。 最后,关于压缩包内的“重构.ppt”文件,这可能是一个关于重构技术的...

    代码重构.pdf

    《代码重构》一书由Martin Fowler编写,是软件开发领域中关于代码质量提升的经典之作。书中详细阐述了重构代码的必要性、重构的时机以及如何安全地重构代码。重构指的是在不改变软件外部行为的前提下,改进其内部...

    Matlab重构算法_matlab_matlab压缩感知重构算法程序实现_压缩感知_

    在本文中,我们将深入探讨基于Matlab的压缩感知(Compressive Sensing,简称CS)重构算法的实现。压缩感知是一种理论先进的信号处理方法,它允许我们以远低于奈奎斯特定理所要求的采样率捕获信号,并能恢复原始信号...

    用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构

    资源名:用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构 资源类型:matlab项目全套源码 源码介绍:用于信号的分解、降噪和重构,实现故障诊断 源码说明: 全部项目源码都是经过...

    [电子书] 重构与模式

    《重构与模式》是软件开发领域的一本经典著作,作者为Addison-Wesley Professional出版社。这本书主要探讨了如何在实际编程过程中有效地进行重构,并将其与设计模式相结合,以提升软件质量和可维护性。 重构是一种...

    重构.pdf_电子版_pdf版

    重构.pdf_电子版_pdf版 本资源主要讲解了软件设计中的重构(Refactoring)概念,并提供了一个实际案例来演示如何通过重构来改进代码结构。 什么是重构? 重构是软件设计中一种重要的技术,它的目的是为了使代码变...

    C语言重构--Garrido2000

    尽管人们已经认识到这个问题,但市场上并没有很多工具能够帮助维护人员或程序员进行重构。构建一个精确、全面、可用、高效且完整的重构工具比构建一个优化器更加困难,因为后者并不需要具备易用性、全面性和完整性;...

    软件重构 软件重构经典PPT

    【软件重构】是一种重要的软件开发实践,旨在提升代码的质量、可读性和可维护性,同时保持软件原有的功能和外部行为不变。这一概念由 Martin Fowler 在他的著作《重构:改善既有代码的设计》中进行了深入阐述。重构...

    Python代码重构的艺术:探索自动化重构工具

    ### Python 代码重构的艺术:探索自动化重构工具 #### 一、引言 Python 作为一门高级编程语言,自1991年首次发布以来,便以其简洁易读的语法、强大的标准库支持以及广泛的跨平台特性赢得了众多开发者的青睐。随着...

    重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt

    重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt重构ppt

    项目重构方案模板、ppt

    项目重构方案模板、项目重构方案模板ppt,项目重构方案计划模板

    重构改善既有代码的设计PPT课件

    重构是软件开发过程中的一个重要环节,它关注于改善已有代码的设计,以提高代码的可读性和维护性,同时保持原有功能不变。通过重构,程序员能够更有效地管理代码,提升开发效率,减少错误,并促进团队成员之间的沟通...

    Martin Fowler《重构——改善既有代码设计》(中文版)

    《重构——改善既有代码设计》是软件工程领域的一部经典著作,作者Martin Fowler,该书与《设计模式》被并称为软件工程的双雄。《重构》一书的主旨在于向读者展示重构的过程与方法,即通过一系列小的、有步骤的改变...

    重构pdf+chm版本

    《重构:改善既有代码的设计》是一本由Martin Fowler所著的经典IT著作,它在软件开发领域具有极高的影响力。这本书的PDF和CHM版本都包含了关于重构和代码优化的深入探讨,是学习重构技术的理想资源。 重构是软件...

Global site tag (gtag.js) - Google Analytics