一个查询的性能


  今天项目中遇到一个模糊查询的性能问题,在一个输入框中模糊查询,结果分页显示.设计人员把该处设计为可以输入三种匹配类型数据:身份证,姓名,学籍号. 数据库中总共约十万条数据.我在输入框中随意输入一个身份证号码,发现等待"很长"一段时间才查出来,目测2秒左右.于是立即到后台方法生打印时间,运行结果约为1400ms.检查sql语句(前员工所写):

1 select a.ActualName,a.idCard ,a.compile,b.unitName,a.UserName  
2 
3     from a left join b  on a.DepId=b.DepId  

          where a.ActualName like '%$conditon%' or a.UserName like '%$conditon%' or a.idCard like '%$conditon%'

select count(a.UserId)  from  a 

      left join  b on a.DepId=b.DepId 

           where a.ActualName like '%$conditon%' or a.UserName like '%$conditon%'  or a.idCard like '%$conditon%'

condition中是将传入的参数.看了之后,发现两个问题并作出修改:

  1. 查询记录数是count(a.UserId)中UserId不是索引列,改为索引列Xxx,运行,查询时间几乎无变化
  2. 第二条sql不需要使用连表查询(估计是复制粘贴的结果),改为:
select count(UserId)  from a
     where ActualName like '%$conditon%' or UserName like '%$conditon%' or idCard like '%$conditon%'

运行结果:查询时间几乎无变化.

  后来再次分析SQL,发现应该是两个 "OR" 语句的模糊匹配消耗时间,然后将页面的一个输入框改为三个输入框分别接受不同查询条件,后台判断用户输入了哪些字段再进行模糊匹配,当输入字段自由一个时,再次运行结果:900ms,速度提高约1/3.(之前只有一个输入框用户一次也只能查询匹配一个字段).

  看来不好的设计对程序性能影响也很大啊.

优质内容筛选与推荐>>
1、超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
2、jQuery中animate动画第二次点击事件没反应
3、Mysql优化系列之查询性能优化前篇1
4、MySQL DATE_ADD() 函数(转载)
5、tomcat启动流程 和 struts 详解


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn