各位高手:
  请教一个索引使用的问题,如下:
  有两张表属性如下:
   TableA 包含:id (int(10))以及其它字段 ;
   TableB 包含:id (int(10))以及其它多个字段;
   现需要查找出TableA中包含的,但是TableB中不包含的id所对应的行,使用如下查询操作:
   select * from TableA where id not in (select id from TableB); (语句1)
   
   由于A,B中的行数都非常多,大约在百万级别,所以上面的语句查询速度比较慢,在网上查了一下,说是引入索引可以来加快查询速度,故想使用以下方法:
  在TableB中的id字段上建立索引: create index tbb_idx on TableB(id)。(语句2)
  
  请问,上述 语句2对应的建立索引 的方法是否只可以加快 上述语句1对应的查询 的执行速度?是否有其它更好的方法?
  另外,补充问一下,如果基于语句2建立了索引,语句1中的select id from TableB不用改写成 select tbb_idx from TableB吧?
 
  新手菜鸟,呵呵, 谢谢指点。。

解决方案 »

  1.   

    1、2005以上可以使用:
    SELECT  ID
    FROM    a
    EXCEPT
    SELECT  id
    FROM    b2、2000的话,你可以先不建索引,然后打开实际执行计划,也就是在查询分析器按:ctrl+m,然后运行,看看执行计划是否有表扫描这些东西,如果有索引查找,那证明用到了索引
      

  2.   

    首先int型是不需要规定长度的
    然后一般会在将id这类唯一标示作为主键,主键默认会被设置为聚集索引
    就是索引中最快的,建立索引的目的就是为了提高查询效率
    你子啊B表中建立的索引查询只会作用在B表,也就是select id from TableB这句有效
    所以应该相应的在A表也建立索引,创建索引后的效率是很显著的
      

  3.   


    不好意思,之前没有看清楚版块,这个问题是针对MySql的。
    补充问一句:
    如何在MySql中分析 添加索引后的 查询速度提升了多少?
      

  4.   

    谢谢回复:
    1)是否是说,MySql会默认为主键创建索引?
    2)如何定量分析索引对于查询效率提升的效果?
      

  5.   

    mysql可能没这个模式行为,其实mysql也有执行计划,而且索引又不影响数据,所以你可以加了再测试性能,mysql的确不熟,不知道有没有SQLServer那种:
    set statistics time/io on 的配置,这个可以显示执行所耗费的具体时间(精确到毫秒),还有IO,这两个是主要衡量性能的标准值。在SQLServer中,还是要看执行计划。
      

  6.   

    额。。这真不知道了呵呵,对mysql不熟啊,
    不过据我所知,大部分数据库,如mysql、oracle这些在大表的查询上
    建立相应的索引前后对比的效果都是显著的
    mysql不知道是怎么分析的,sqlserver可以在查询计划中查看分析
    实际一点说,sqlserver中一般像百万级的表,假设你全表查询没索引的id用了3s
    那么加了索引应该在1s以下,那具体的mysql的你还是再问问其他人吧呵呵
      

  7.   

    select * from TableA where not exists (select 1 from TableB where id = TableA.id);create index tbb_idx on TableB(id);
      

  8.   

    多谢版主,进一步地问下:
    1)上述的查询操作中,有没有必要对于TableA(id)也创建索引呢?
    2)有没有什么方法可以定量地分析 索引添加前后 上述查询操作速率提升情况?
      

  9.   

    1)上述的查询操作中,有没有必要对于TableA(id)也创建索引呢?
    2)有没有什么方法可以定量地分析 索引添加前后 上述查询操作速率提升情况?
    explain select ... 看执行计划