a表有记录20多万条
b表有1000多条吧a表x值:
=4 大概有:1000条
=5 大概有:100条
=6 大概有:10条
为什么这样一条查询就慢死了select a.1,a.2,a.3,b.1,b.2 from b left join a on b.id=a.id where a.x=4
或者
select a.1,a.2,a.3,b.1,b.2 from a,b where b.id=a.id and a.x=4
而查询:
a.x=5或=6时候速度很快......有谁能解决不?????我是用:php+adodb来连oracle的......

解决方案 »

  1.   

    索引我都建了。这几个字段都建好索引了.....不知道为什么就是慢。我是用adodb里的...SelectLimit()来执行的....
      

  2.   

    字段类型都不知道就瞎说要建索引.id如果是数字字段话,这里建议建立索引,因为它是主要的查询参照字段.两表记录的数据是怎样的,主要是依赖性关系是怎样的.
    b表数据很少,如果a表依赖b表也可以查询出正确的数据的话.
    b left join a 会是更为明智的选择.以下是MySQL手册关于LEFT JOIN 的优化建议.在MySQL中,A LEFT JOIN B实现如下: 表B被设置为依赖于表A。 
    表A被设置为依赖于所有用在LEFT JOIN条件的表(除B外)。 
    所有LEFT JOIN条件被移到WHERE子句中。 
    进行所有标准的联结优化,除了一个表总是在所有它依赖的表之后被读取。如果有一个循环依赖,MySQL将发出一个错误。 
    进行所有标准的WHERE优化。 
    如果在A中有一行匹配WHERE子句,但是在B中没有任何行匹配LEFT JOIN条件,那么在B中生成所有列设置为NULL的一行。 
    如果你使用LEFT JOIN来找出在某些表中不存在的行并且在WHERE部分你有下列测试:column_name IS NULL,这里column_name 被声明为NOT NULL的列,那么MySQL在它已经找到了匹配LEFT JOIN条件的一行后,将停止在更多的行后寻找(对一特定的键组合)。 
      

  3.   

     你需要看一下mysql优化方面的文章,确实主键与副键类型一样,这也是很有必要的。