有二个表, 
a(aid,name)
b(bid,aid,title,content)有查询语句
select b.bid,a.name,b.title,b.content where a.aid=b.bid;a.aid肯定要建立索引, 那么请问要b.bid要建立索引吗 ?

解决方案 »

  1.   

    where a.aid=b.bid;不是where a.aid=b.aid;  ?两个表中理论上只需要有一个表中有索引即可。 如果是B是多的那个表,则B上可以不建。即使建了也不起作用,毕竟B上是全表扫描
      

  2.   

    先建立,然后用explain 跟踪语句看看效果
      

  3.   


    对, 是 from a,b where a.aid=b.aid 你说的如果是B是多的那个表, 指的是什么? 不明白, 这样写查询语句, 会同时扫描两个表吗? 还是扫完一个再扫描另一个? 
      

  4.   

    A
    aid, col
    1    A1
    2    A2
    3    A3B
    bid,aid,bcol
    1    1   B1
    2    3   B2
    3    2   B3
    4    3   B4
    5    1   B5这种情况下,让你手工把这些信息组合到一个新的本子上,你会怎么做?
    1。 打开B
    2。 抄写B的第一行, 1    1   B1
    3。 由于A按序排列,直接找到 aid=1 的记录本(使用A的索引),抄写 A1
    4。抄写B的下行,循环结束。所以B的上索引根本没用。除非你仅从索引中取记录
      

  5.   

    where 后面的列基本上都会建立索引 大众的做法
      

  6.   


    大众做法是 where 后面的建立索引, 但等号之后的呢
      

  7.   

    如果按五楼acmain的说话, 那么这样设计表检索时不是要比下面设计的慢得多?A(aid,name)
    B(bid,name,title,content) -- 把原先的aid换了name那么查询就可以  SELECT  bid,name,title,content FROM B
    这样只扫描一个表就够了, 但我看到大部份项目都是像我一楼那么设计的
      

  8.   

    是啊。因为你将来并不只是这一种查询啊。如果你有select * from a ,b where a.aid=b.aid and a.name='xxx' 此刻就是用到B上的索引了。
      

  9.   


    你是说 select bid,name,title,content from B where name='xxx' 这样用到B的索引吗?
    select * from a ,b where a.aid=b.aid and a.name='xxx' ?? 这样B不用索引吧