SQL语句里where条件的IN中放置太多数据项导致数据库查询慢怎么解决? 我正在做一个人员管理系统,一个人属于一个部门,部门之间有隶属关系。用的数据库是DB2。我要实现的功能是,根据当前登录用户所属部门查出所有下属部门,然后将这些部门的所有人员都查出来。遇到的问题是,如果一个部门的级别很高,它的下属部门就很多(多的情况下会有近百条),在查询人员的时候会有一个条件IN(所有部门),这样可能会导致数据库查询很慢(别人说会很慢,我没试过不知道)。请大家帮我想想办法,该怎么解决。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 抱歉,说错了,我们用的是MySQL数据库。请问楼上,用join查询的意思是对每一个部门执行一个select语句,对结果合并?这样的性能会比用in高? 你不能把需要查的部分使用 SQL 出来么?再与结果集进行 JOIN 你可以用NOT in 来试试啊。要么就用or这样的关键字来拼咯。 最好not in还有or不要用,能不用就不用 可能我没表达清楚,我的意思是把部门全部查出来以后,有多少个部门就写多少个select语句,然后用join连接起来,发送到数据库一次执行。为什么这样做的性能会比用in要高呢? MySQL IN 里面几百个参数,根本感觉不到慢的。数据表超过百万条记录,才有必要考虑效率问题 你这样做不对 应该是点到 A部门 显示 A部门下的分部门以及A部门下的员工(1次查询)然后点到A部门下的分部门B,然后在B部门下显示B部门下的分部门下的员工(再1次查询)你如果要从根节点 直接把全部的东西一次性 全部查询出来的话 呵呵 要完蛋啦。还有不要用语句拼写啦 用 面向OO的方式吧 直接 A a = em.find(id); a.getSons()然后遍历 多少 写个递归一个方法搞定。 NOT in 和 in(in是不能命中索引)一般用exists来代替 这个你要是数据库设计的好,根本就不用in,比如说顶级部门 A01 总经办 A02 生产部 A0201 胶印车间 A0201 彩盒车间 没有发布完成A01 总经办A02 生产部A0201 胶印车间A0202 彩盒车间A020101 胶印打包车间A020102 胶印检测车间如果要查生产部门 like 'A02%'如果要查 胶印车间 like 'A0201%'如果要查 胶印打包车间 like 'A020101%'这样不久解决了你的问题 但是like会比较慢,如果说查询生产部门A02 这样,把员工信息的部门截取前三位查询前三位 ='A02'如果说查询 胶印车间A0201 把员工信息的部门截取前五位 查询前五位='A0201'这样查询会比前面的要快 Spring管理Action 中的 scope="prototype" spring 3.0中怎么没有spring.jar java新手,求一段简单代码的解释 struts2出现404错误,找不到/mytest/saveUser的action 怎么确认第二次是否删除 将成绩A,B,C,D对应的百分制成绩,例如A对应85~100分 请问JSTL中可以定义数组类型吗? 数据源与连接池是什么关系? 请问学EJB要有那些前提知识? 请指两本好书 在jtable中如何添加button(或者一个监听事件) 请教hashmap两个map匹配 struts和hibernate的注册 帮忙修改一下 可以不
抱歉,说错了,我们用的是MySQL数据库。请问楼上,用join查询的意思是对每一个部门执行一个select语句,对结果合并?这样的性能会比用in高?
可能我没表达清楚,我的意思是把部门全部查出来以后,有多少个部门就写多少个select语句,然后用join连接起来,发送到数据库一次执行。为什么这样做的性能会比用in要高呢?
数据表超过百万条记录,才有必要考虑效率问题
你这样做不对 应该是点到 A部门 显示 A部门下的分部门以及A部门下的员工(1次查询)
然后点到A部门下的分部门B,然后在B部门下显示B部门下的分部门下的员工(再1次查询)你如果要从根节点 直接把全部的东西一次性 全部查询出来的话 呵呵 要完蛋啦。还有不要用语句拼写啦 用 面向OO的方式吧 直接 A a = em.find(id); a.getSons()然后遍历 多少 写个递归一个方法搞定。
一般用exists来代替
比如说顶级部门 A01 总经办
A02 生产部
A0201 胶印车间
A0201 彩盒车间
A01 总经办
A02 生产部
A0201 胶印车间
A0202 彩盒车间
A020101 胶印打包车间
A020102 胶印检测车间如果要查生产部门 like 'A02%'
如果要查 胶印车间 like 'A0201%'
如果要查 胶印打包车间 like 'A020101%'
这样不久解决了你的问题
但是like会比较慢,
如果说查询生产部门
A02 这样,把员工信息的部门截取前三位查询前三位 ='A02'如果说查询 胶印车间
A0201 把员工信息的部门截取前五位 查询前五位='A0201'
这样查询会比前面的要快