select count(tab1.xxId),tab.xxName from tab1 left join tab2 on tab1.xxId=tab2.xxId where tab1.xxName like '%someString1%' and yyName like '%someString2%' group by tab1.xxId oder by tab1.xxId limit 0,20;

解决方案 »

  1.   

    又错了。
    select count(tab1.xxId),tab1.xxName from tab1 left join tab2 on tab1.xxId=tab2.xxId where tab1.xxName like '%someString1%' and tab2.yyName like '%someString2%' group by tab1.xxId oder by tab1.xxId limit 0,20;
      

  2.   

    看上去也不好再优化了,两个表的关联字段xxId字段都要有索引,一次只查20条,应该速度还可以吧,like语句本身效率低一些,象xxName like '%someString1%'这样的语句无法利用xxName索引,like 'someString1%'倒是可以利用xxName索引的,既然用不上Name索引就没必要建Name的索引了,会增加没必要的开销
      

  3.   

    执行速度超过几分钟我等了超过5分钟没有结果。query(select xxId,xxName from tab1 where xxName like '%someString1%' order by xxId limit 0,20);
    while(mysql_fetch_row()){
        query(select count(*) from tab2 where xxId='theXxId' and yyName like '%someString2%');
        mysql_fetch_row();
    }
    还没有用这个快。
      

  4.   

    另外,我想了建立临时数据表的方法:
    mysql> create TEMPORARY TABLE temp_tab_1 select count(*) as num,xxId from tab2 where 1 group by xxId;
    Query OK, 1308 rows affected (2.58 sec)
    Records: 1308  Duplicates: 0  Warnings: 0mysql> select a.xxId,a.xxName,b.num from tab1 as a left join temp_tab_1 as b on a.xxId=b.xxId where 1 order by a.xxIdlimit 0,20;20 rows in set (1.05 sec)
    这样速度就快多了。但是这样create talbe , drop table ,权限太大了,而且多人同时操作可能有问题。有没有什么办法让它不生成临时表而同样能达到这种效果???
    大大们帮帮忙!
      

  5.   

    你如果在两个表的xxId字段上都建了索引的话,应该不至于那么慢啊,有没建立索引啊,建立索引的话其速度与不建立差别会很大的。你建立临时表的话起一样的名字其实并没有关系,多人操作并不受影响:你可以开两个窗口进入数据库,建立一摸一样的两个同名临时表,是可以建立的,他们是属于两个不用会话的表
      

  6.   

    呵呵,都建立索引了,但是嘿嘿其中一个tab1是int字段,另外一个tab2是varchar字段没办法,表就是这样子,如果改表结构的话可能就问题大条了因为这个xxId不是auto_increace ,是一个合成字段很多程序里的sql语句用了substring()函数大大,还有没有其他办法啊?
    能给解释一下,为什么临时表很快,而关联却那么慢呢?
      

  7.   

    你索引没损坏吧?可以drop索引重建试试。你临时表查询条件中并没有xxName like '%someString1%'这样的语句,like语句效率是比较低的,你把前面的联合语句中的like语句部分都去掉,看看速度有什么变化。可以在你SQL前加explain分析下,没那个数据环境,不好测试。
      

  8.   

    恩。我实际测得时候没有like的,我之所以写like,因为那代表了完全形态。我在测试中两种方式都是where 1。
    另外,请问,有没有一种写法能不建立临时表,却完成我上面那个建立临时表再关联的方法???
      

  9.   

    之前我说的可能有错误,2个表的数据正常情况是我之前说的。
    但是我这个测试数据库里的数据有点混乱:)-->tab2里有的xxId ,tab1里不一定有。。
    另外,我测试了join(代替left join),结果是74s出了结果
      

  10.   

    终于行了
    原来可能是索引出问题了。
    不过这样做where 1 全查仍然需要10s(带条件的要比这个快)。。
      

  11.   

    你那个临时表方法查出来的结果应该跟直接左连接查出来的结果会有些差别,象你所说的正常情况下,tab1中有的tab2中不一定有,临时表法中b.num可能会返回NULL值。查询慢一些可能是tab2表中xxId重复值比较多,以至索引优势不能发挥好。具体执行查询过程你可以用explain分析一下以确定优化策略,explain用法参见http://www.linuxeden.com/doc/article.php/21502;