A是信息表 B是用户表,A中uid是外键。AB是N对1的关系。假设两个表中数据都非常多。
想select出指定日期下的a.msg和相对应的pw。
就是 select msg,pw from A,B where A.uid=B.uid and A.date='20111103'问题就是:1 如果指定日期是20111103。并且A表中20111103的行比较
那么用
select msg,pw from A,B where A.uid=B.uid and A.date='20111103'
这个语句是不是效率低下?
在这种情况下,
select A.msg,A.uid from A where A.date='20111103'得到A中的uid 。
然后再select pw from B where B.uid=uid得到pw  这种是不是比上面的效率要高?2 如果指定日期是20111103。并且A表中20111103的行比较
那么用select msg,pw from A,B where A.uid=B.uid and A.date='20111103'这个语句是不是效率相对较高?

解决方案 »

  1.   

    这个和date多少没关系,date上面有没有索引关系更大。
      

  2.   

    如果有索引 A.date 则不管如何写语句,MYSQL都会优化处理。先走A.date的索引,然后再到B表中主键查询。
    如果没有索引。MYSQL同样会先where A.date='20111103',然后再根据主键去B表查询
    MYSQL本身就会对语句进行优化。
      

  3.   

    我明白,楼主考虑到是小表驱动大表查询。
    理论上,如果A表数据少,你从A表取出满足条件的编号,再从B表通过IN (,,,,,,)得到对应编号的数据,效率是要高。但考虑到你使程序变得复杂;结果解析变得复杂,现在有两个结果集;A表数据多少也是不定的;你得到效率上稍许的提升,但付出的代价要大得多。一般小表驱动大表,是两个表都有条件过滤的情况下,你通过子查询的方式指定优先处理哪个表。
      

  4.   


    mysql会优化。比如,很多时候,如果表中数据很少,它并不一定会用索引,而是直接扫描全表。
    但是,你这里面,看不出走date索引会效率低下的情况。
      

  5.   

    有没有索引,MYSQL都不会先去构造这具笛卡尔积。笛卡尔积只是理论上的集合算法。实际实现中,数据库会进行优化。