`
freeheron
  • 浏览: 67428 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

以简化繁解决性能问题

阅读更多

最近系统出了一点问题。在客户那边,因为系统的用户规模的变大,历史数据变得特别大。十来天的数据就有上千万了。系统本身就是一个准实时系统,响应要求较高。但是有个数据库操作却需要化4分钟多。客户没法接受了。这个操作是通过一个存储过程来做的。模拟了一个环境,测试了一下,发现是其中的一个查询特别费时。

       语句很简单:select count(*) into @totalCount from A where ( condition1 or conditon2) and condition3  and condition4

       表A的数量大概是一千五百万,查询语句的结果是6000多。查了查,该有的索引都有了。

用的是MySQL的InnoDB。对于InnoDB来说,上千万的数据确实是多了。需要从SQL语句本身来优化确实很不容易了。但是这个语句的问题也很明星,条件or很扎眼。肯定有问题。改一下:

      select count(*) into @a from A where condition1 and condition3 and condition4;

      select count(*) into @a from A condition2 and condition3 and condition4;

      set @totalCount=@a+@b;

 

效果很明显,只需5秒多就出来了。

 

有时使用几个简单的语句可能比复杂的一条语句更有效。这个当然得看数据库。最好是测试一些。

 

在这种还想起了MySQL一个让很多人头疼的问题:就是count的速度问题。当count的数据量很大时,InnoDB的速度确实很不敢恭维。在数据库端确实也没有什么特别好的解决方法。既然在数据库端没法解决,那能不能在应用端解决呢。因为MySQL对SQL语句的执行是单CPU的,而现在机器都有多颗CPU,能不能把count语句按一定的条件分成多个语句进行并发查询,然后再把结果相加呢。Java自1.5版本加了concurrent包之后,对于并发编程已经是相当简单了。可以试试。当然在实际应用中还要考虑另一个问题:数据库连接数的问题,并发查询语句多了,连接数自己就增加了。有没有效果,还得看具体应用。

3
0
分享到:
评论
1 楼 丁林.tb 2010-11-30  
改进前后的执行结果并不完全等价吧? 如果condition1 和 condition2有重合部分,
改成两句后,和的结果会变多吧

能确保没交际就没问题了


也可以考虑根据condition3和condition4建联合索引,把语句改成 where  condition3  and condition4 and (condition1 or conditon2)

相关推荐

    云课堂用户手册

    该解决方案是为计算机教学量身定制的“云计算”解决方案。定制化的教学管理软件和虚拟化平台,功能设计化繁为简。根据教师、学生的使用习惯与教学流程,优化了教学常用功能并进行深度设计;采用高性能云主机和独创的...

    asp.net知识库

    帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个...

    曼波整站系统5.2.0

    使在mysql5.0.xx 环境正常安装使用 1) 解决索引过长问题,把4个 acl 表的字段 section_value 和 value 统一为 varchar(100),字段 name 统一为 varchar(255) 2) 优化表,清除没用的或重复的索引 3) 改进...

    创都启航企业网站管理系统源码 v3.0

    7、解决热点关键词无作用问题。 8、手机网站实现2级栏目自定义管理。 9、完善生成手机静态页全部分项生成功能。 10、完善微信自定义菜单设置。 11、改进微信公众平台管理功能。 12、优化后台UI设计。 13、增强后台...

    java开源包1

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包11

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包2

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包3

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包6

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包5

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包10

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包4

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包8

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包7

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包9

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包101

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    Java资源包01

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    yershop开源网店系统 v3.8.2.zip

    让应用的扩展更加方便,基于MVC(Model-View-Controller,模型-视图-控制器)模式,并且均支持多层(multi-Layer)设计,全面采用命名空间方式定义和加载类库文件,有效的解决多个模块之间的冲突问题,并且实现了更加...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics