Jason ---分享,共同進(jìn)步

          激情成就夢(mèng)想,努力創(chuàng)造未來(lái)
          隨筆 - 53, 文章 - 1, 評(píng)論 - 45, 引用 - 0
          數(shù)據(jù)加載中……

          索引的使用

          索引的簡(jiǎn)單使用說(shuō)明:

          一.常用掃描方式:
          .全表掃描
           全表掃描就是順序地訪問(wèn)表中每條記錄.
          .索引掃描  
          索引唯一掃描(index unique scan)
          索引范圍掃描(index range scan)
          索引全掃描(index full scan)
          索引快速掃描(index fast full scan) 

          1.索引唯一掃描(index unique scan)
          通過(guò)唯一索引查找一個(gè)數(shù)值經(jīng)常返回單個(gè)ROWID。如果該唯一索引有多個(gè)列組成(即組合索引),則至少要有組合索引的引導(dǎo)列參與到該查詢中,如創(chuàng)建索引:create index index_test on building(name,status)。
          如:語(yǔ)句:
          select id from building where name='國(guó)際科技大廈'
          此語(yǔ)句可以使用該索引。如果該語(yǔ)句只返回一行,則存取方法稱為索引唯一掃描。
          而語(yǔ)句:
          select name from building where status ='1'
          因?yàn)閣here條件沒(méi)有用到索引的引導(dǎo)列。所以索引不生效。

          2.索引范圍掃描(index range scan)
          使用一個(gè)索引存取多行數(shù)據(jù),同上面一樣,如果索引是組合索引
          如:select id from building where name like 'H%' and status='1' 語(yǔ)句返回多行數(shù)據(jù),此時(shí)的存取方法稱為索引范圍掃描。
          使用index rang scan的3種情況:
          (a) 在唯一索引列上使用了range操作符(> < <> >= <= between)
          (b) 在組合索引上,只使用部分列進(jìn)行查詢,導(dǎo)致查詢出多行
          (c) 對(duì)非唯一索引列上進(jìn)行的任何查詢。

          3. 全索引掃描(index full scan)
          SQL請(qǐng)求的全部列(column)必須駐留在索引樹(shù)中;也就是說(shuō),SELECT和WHERE字句中的所有數(shù)據(jù)列必須存在于索引中。并且排序返回。

          4.索引快速掃描(index fast full scan)
          掃描索引中的所有的數(shù)據(jù)塊,與 index full scan很類似,但是一個(gè)顯著的區(qū)別就是它不對(duì)查詢出的數(shù)據(jù)進(jìn)行排序,即數(shù)據(jù)不是以排序順序被返回。

           

          二.什么情況下應(yīng)該建立索引
          1.表的主關(guān)鍵字(建立唯一索引)
          2.表的字段唯一約束
          3.直接條件查詢的字段,在SQL中用于條件約束的字段
          4.查詢中與其它表關(guān)聯(lián)的字段,字段常常建立了外鍵關(guān)系
          5.查詢中排序的字段
          6.查詢中統(tǒng)計(jì)或分組統(tǒng)計(jì)的字段

          三.什么情況下應(yīng)不建或少建索引
          1.表的記錄很少
          2.對(duì)一些經(jīng)常處理的業(yè)務(wù)表應(yīng)在查詢?cè)试S的情況下盡量減少索引
          3.數(shù)據(jù)重復(fù)且分布平均的表字段
          假如一個(gè)表有10萬(wàn)行記錄,有一個(gè)字段A只有T和F兩種值,且每個(gè)值的分布概率大約為50%,那么對(duì)這種表A字段建索引一般不會(huì)提高數(shù)據(jù)庫(kù)的查詢速度

          四.索引應(yīng)用注意事項(xiàng)
          1. IS NULL 與 IS NOT NULL
          不能用null作索引,任何包含null值的列都將不會(huì)被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會(huì)從索引中排除。也就是說(shuō)如果某列存在空值,即使對(duì)該列建索引也不會(huì)提高性能。 任何在where子句中使用is null或is not null的語(yǔ)句優(yōu)化器是不允許使用索引的。

          2.帶通配符(%)的like語(yǔ)句
          如: select * from building where name like '%中心%'
          name為building表的索引,則此索引就不會(huì)生效,這里由于通配符(%)在搜尋詞首出現(xiàn),通配符如此使用會(huì)降低查詢速度。然而當(dāng)通配符出現(xiàn)在字符串其他位置時(shí),優(yōu)化器就能利用索引
          select * from building where name like '&中心%'

          3. Order by語(yǔ)句
            ORDER BY語(yǔ)句決定了如何將返回的查詢結(jié)果排序,任何在Order by語(yǔ)句的非索引項(xiàng)或者有計(jì)算表達(dá)式都將降低查詢速度。order by后面的排序字段盡量使用索引字段。

          4.'<>'的用法
          例如:
          select * from building where id<>5000;
          select * from building where id>5000 or id<5000
          結(jié)果一樣,但是第二句id索引生效。

          5.可以使用外部連接優(yōu)化not in子句,例如:
          select name from building where fk_building in (select deptid from test where name='test' and ifdeleted=0);
            
          改為:
          select name from building a,test b where a.fk_building=b.id and b.name='test' and ifdeleted=0;

          6.索引列是否函數(shù)的參數(shù)。如是,索引在查詢時(shí)用不上。

          7.主從表關(guān)聯(lián)方式
          如果:building.id上有一索引
          在district.id上有索引
          如:
          select contract_code from building a,district b where a.id=b.id
          building.id上的索引就會(huì)生效
          反之同理。


          8.是否存在潛在的數(shù)據(jù)類型轉(zhuǎn)換。如將字符型數(shù)據(jù)與數(shù)值型數(shù)據(jù)比較,ORACLE會(huì)自動(dòng)將字符型用to_number()函數(shù)進(jìn)行轉(zhuǎn)換,從而導(dǎo)致上一種現(xiàn)象的發(fā)生。


          9.索引應(yīng)用的優(yōu)先級(jí);

          (1).唯一性索引的等級(jí)高于非唯一性索引. 這個(gè)規(guī)則只有當(dāng)WHERE子句中索引列和常量比較才有效.如果索引列和其他表的索引類相比較. 這種子句在優(yōu)化器中的等級(jí)是非常低的.

          (2).如果多個(gè)索引在一個(gè)查詢中都可應(yīng)用,那么如果條件中應(yīng)用索引和常量進(jìn)行比較,那么這個(gè)索引先被利用。


          10.語(yǔ)句的執(zhí)行計(jì)劃中有不良索引時(shí),可以人為地屏蔽該索引,方法:
            
            。數(shù)值型:在索引字段上加0,例如
            select * from building where id+0 = 0;
            
            。字符型:在索引字段上加‘’,例如
            select * from building where name||’’='test';

           

           

           

          posted on 2008-03-11 15:07 agun 閱讀(733) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          主站蜘蛛池模板: 北碚区| 台安县| 牡丹江市| 临海市| 广饶县| 辽阳市| 德保县| 云阳县| 清河县| 兴安县| 堆龙德庆县| 秭归县| 尼勒克县| 新密市| 交城县| 博罗县| 景泰县| 车险| 乐清市| 大悟县| 广丰县| 叙永县| 北碚区| 新丰县| 海盐县| 分宜县| 清河县| 灵丘县| 格尔木市| 富川| 渝中区| 阜阳市| 鹤庆县| 夏津县| 白沙| 垣曲县| 中山市| 金平| 泉州市| 巴南区| 永年县|