数据库中的两个表连接起来,只用某一个表的字段设置条件,速度没问题。如果查询条件涉及到两个表中的字段,速度就很慢。我查询条件用的是LIKE 。
例如:
A表:id    单位B表:id    单位id   人员姓名   年龄    住址
我把两个表连接起来,查询  住址在  某条路上的人员  用的是 like  速度不是很慢。如果加条件,查询某个单位的住址在某个区域的人员,速度就很慢。
有大虾在吗????

解决方案 »

  1.   

    like 本来就很慢,如果多数据量的话,可以采取分页返回记录数处理。
      

  2.   

    可我只用单个表的字段做条件,like 也不慢呀
    有大哥们知道怎么回事吗???
    很急!!!!
      

  3.   

    给出表结构,给出语句 ,给出数据量
    like 的话如果用‘人员%’ 可以用到索引
    如果是 ‘%人员%’就全表扫描了,
      

  4.   

    先谢谢大家帮我。
    SELECT *
    FROM 车辆档案 INNER JOIN
          业户档案 ON 车辆档案.业户id = 业户档案.id INNER JOIN
          m_管理单位 ON 业户档案.单位id = m_单位.id
    WHERE (车辆档案.车号 LIKE '%8787%')如果只是简单的象上边的查询,速度不慢。可是如果再加一个条件的话就很慢了。SELECT *
    FROM 车辆档案 INNER JOIN
          业户档案 ON 车辆档案.业户id = 业户档案.id INNER JOIN
          m_单位 ON 业户档案.单位id = m_单位.id
    WHERE (车辆档案.车号 LIKE '%8787%') AND (m_单位.id = 23)
    这样就很慢了。
    三个表的对应关系是
    车辆档案中的  业户id 对应  业户档案中的 id ,业户档案中的  单位id   对应 m_单位   中的  id.
      

  5.   

    SELECT   * 
    FROM   车辆档案   INNER   JOIN 
                业户档案   ON   车辆档案.业户id   =   业户档案.id   INNER   JOIN 
                m_单位   ON   业户档案.单位id   =   m_单位.id  and  m_单位.id   =   23
    WHERE   (车辆档案.车号   LIKE   '%8787%')  试试,
      

  6.   

    to sailorsailor  
    哥哥,速度没提高,反而比以前的慢了。
      

  7.   

    把你的 执行计划贴上来阿把select * 后面的 * 换成实际的列名查看你的索引,是不在条件列上都有索引阿,如果有,加上提示 (使用索引合并)可以提高效率 
      

  8.   

    SELECT * FROM (
    SELECT *   
    FROM 车辆档案 INNER JOIN   
    业户档案 ON 车辆档案.业户id = 业户档案.id INNER JOIN   
    m_单位 ON 业户档案.单位id = m_单位.id and m_单位.id = 23 ) A
    WHERE (A.车号 LIKE '%8787%')     试试,
      

  9.   

    SELECT * FROM 车辆档案 
    INNER JOIN 业户档案 ON 车辆档案.业户id = 业户档案.id 
    INNER JOIN m_单位 ON 业户档案.单位id = m_单位.id 
    WHERE 业户档案.单位id = 23 AND 车辆档案.车号 LIKE '%8787%' 
      

  10.   

    SELECT   * 
    FROM   车辆档案   INNER   JOIN 
                业户档案   ON   车辆档案.业户id   =   业户档案.id   INNER   JOIN 
                (select * from m_管理单位 where id=23) m_单位  ON   业户档案.单位id   =   m_单位.id 
    WHERE   (车辆档案.车号   LIKE   '%8787%') 连接原则:返回记录比较少的连接放在前面.不知道哪个连接返回的记录比较少?
      

  11.   

    to  gxlineji  上边的那个查询就是前边的内容返回的记录数比较少。可效果很一般
      

  12.   

    还要注意驱动表的选择:
    join连接中一个有驱动表,另一个表为inner table,驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集比较小,而且inner表需要有有效的访问方法(Index)。需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。你看看那个表的记录数比较少,就让它作为驱动表,然后再选择返回记录比较少的连接放在前面.不知道你建立索引了没有,如果没创建,再怎么优化也快不了多少.
    以下语句 车辆档案 是驱动表:
    SELECT   * 
    FROM   车辆档案   INNER   JOIN 
                业户档案   ON   车辆档案.业户id   =   业户档案.id   INNER   JOIN 
                m_单位   ON   业户档案.单位id   =   m_单位.id 
    WHERE   (车辆档案.车号   LIKE   '%8787%')   AND   (m_单位.id   =   23)