當前位置:成語大全網 - 古籍善本 - 如何在數據庫索引中使用索引查詢?

如何在數據庫索引中使用索引查詢?

1.合理使用索引\x0d\ index是數據庫中重要的數據結構,其根本目的是提高查詢效率。目前,大多數數據庫產品采用由IBM首先提出的ISAM索引結構。\x0d\索引要使用得當,原則如下:\x0d\索引建立在頻繁連接但未指定為外鍵的列上,對於不頻繁連接的字段,索引由優化器自動生成。\x0d\在經常排序或分組(即按group或order by操作)的列上創建索引。\x0d\在條件表達式中經常使用的具有更多不同值的列上創建搜索,而不在具有較少不同值的列上創建索引。例如,employee表的“性別”列中只有“男性”和“女性”兩個不同的值,因此不需要建立索引。如果建立了索引,不但不會提高查詢效率,反而會嚴重拖慢更新速度。\x0d\如果有多列要排序,可以在這些列上創建復合索引。\x0d\使用系統工具。例如,Informix數據庫有壹個tbcheck工具,可以檢查可疑的索引。在某些數據庫服務器上,由於頻繁的操作,索引可能無效或者讀取效率降低。如果使用索引的查詢莫名其妙地變慢,可以嘗試用tbcheck工具檢查索引的完整性,必要時修復。另外,當數據庫表更新大量數據時,刪除並重建索引可以提高查詢速度。\x0d\(1)在下面兩個select語句中:\ x0d \ select * from table 1 where field 1 = 0;\ x0d \ SELECT * FROM table 1 WHERE field 1 & gt;=0且field1=0,第壹條select語句比第二條select語句效率高得多,因為第二條select語句的第壹個條件消耗了大量的系統資源。\x0d\ First原則:最具限制性的條件應該放在where子句的最前面。\x0d\(2)在下面的select語句中:\x0d\SELECT * FROM tab其中a=?而b=?而c=?;\x0d\如果有索引index(a,b,c),where子句中字段的順序應該與索引中的順序相同。\x0d\第二原則:where子句中字段的順序應該與索引中的順序相同。\ x0d \————————————x0d \以下假設field1上有唯壹索引I1,field2上有非唯壹索引I2。\ x0d \ ———————————\ x0d \(3)Select field 3,field 4 from TB where field 1 = ' SDF ' fast \ x0d \ Select * from TB where field。\x0d\(4) SELECT field3,field 4 FROM TB WHERE field 1 & gt;='sdf' Kuai \ x0d \ Select Field3,field 4 from TB where field 1 > Sdf '慢\ x0d \因為前者可以快速定位索引。\x0d\ (5) select field3,field 4 from TB where field 2 like ' r % ' fast \x0d\ select field 3,field 4 from TB where field 2 like ' % r ' slow,\ x0d \因為後者不使用索引。\x0d\(6)使用如下函數:\ x0d \ select field3,field 4 from TB where upper(field 2)= ' rmn '不帶索引。\x0d\如果壹個表有20000條記錄,建議不要使用該函數;如果壹個表超過50000條記錄,嚴禁使用函數!2萬條記錄以下沒有限制。\x0d\(7)空值不存儲在索引中,因此\ x0d \ select field3,field 4 from TB where field 2 is[not]null不使用索引。\x0d\(8)不等式如\ x0d \ select field3,field4 from TB where field2!='TOM '不使用索引。\x0d\同樣,\ x0d \ selectfield3,field 4 from TB where field 2 not in(' m ',' p ')不使用索引。\x0d\(9)多列索引,只有當查詢中索引的第壹列用於條件時,才能使用該索引。\x0d\(10) MAX、MIN等函數,使用索引。\x0d\SELECT max(field2) FROM tb因此,如果需要取max、min、sum等。對於字段,您應該添加壹個索引。\x0d\壹次只使用壹個聚合函數,比如\ x0d \ select "min" = min(字段1)," max" = max(字段1) from TB \ x0d \怎麽樣:select "min" = (select min(字段65438)?" max " =(select max(field 1)from TB)\ x0d \(11)查詢優化器不會使用重復值過多的索引。而且因為已經建立了索引,所以在修改這個字段的值的時候需要修改索引,所以更新這個字段的操作比沒有索引的要慢。\x0d\(12)的索引值太大(比如在char(40)字段上建立索引),會造成大量的I/O開銷(甚至超過表掃描的I/O開銷)。因此,盡量使用整數索引。Sp_estspace可以計算表和索引的開銷。\x0d\(13)對於多列索引,ORDER BY的順序必須與索引中字段的順序壹致。\x0d\(14)在sybase中,如果ORDER BY字段形成壹個聚簇索引,就不需要做ORDER BY。記錄的排列順序與簇索引壹致。\x0d\(15)多表連接(具體查詢方案需要通過測試獲得)\x0d\where子句盡可能限制相關字段的使用,盡可能將相關字段放在最前面。\x0d\ select a.field1,b.field2 from a,b其中a.field3 = b.field3 \x0d\ field3。如果沒有索引:\x0d\掃描全表,並排序結果\ x0d \掃描b全表,並排序結果\ x0d \\x0d\適用於非常小的表或巨大的表。\x0d\字段3上有索引\x0d\按表連接順序,B是被驅動表,A是被驅動表\x0d\掃描整個表尋找B \x0d\掃描索引區域尋找A \ x0d \如果有匹配,通過A到rowid壹對多訪問\x0d\(16)。如:\ x0d \ select tb1.field3,tb1.field4,tb2.field2 from tb1,tb2其中tb1.field2 = tb2.field2和tb1.field2 =' bu1032 '和tb2.field2 =' AAA' \ x0d \怎麽樣:\ \x0d\declare @a varchar(80) \x0dSELECT @ a = field 2 FROM TB 2f WHERE field 2 = ' AAA ' \ x0d \ SELECT TB 1 . field 3,tb1.field4,@ a FROM TB 1 WHERE field 2 = ' AAA ' \ X0d \(16)子查詢\ X0d \用exists/not exists替換in/not in運算\ X0d \ Comparison:\ X0d \ SELECT a . field 1 FROM a WHERE a . field 2 IN(IN 在不存在的地方從a中選擇字段1(從b中選擇1,其中b . field 2 = a . field 1)\ x0d \(17)主鍵和外鍵主要用於數據約束。 在sybase中創建主鍵時,會自動創建索引。外鍵與索引無關,因此必須重建索引以提高性能。\ x0d \ (18)不索引CHAR類型的字段比不索引int類型的字段更糟糕。索引後性能只是稍微差壹點。\x0d\(19)使用count(*)代替count(column_name)並避免使用count(DISTINCT column_name)。\x0d\(20)盡量不要使用等號右邊的字段名,如:\ x0d \ select * from TB where field 1 = field 3 \ x0d \(21)避免使用or條件,因為or不使用索引。\x0d\2。避免使用“排序依據”和“分組依據”這兩個詞。\x0d\因為使用這兩個子句會占用大量的臨時空間,如果壹定要使用它們,可以使用視圖和人工生成臨時表的方法來代替。\x0d\如果壹定要用,先檢查壹下內存和tempdb的大小。\x0d\ test證明避免在壹個查詢中同時使用join和group by非常慢!\x0d\3。盡可能少使用子查詢,尤其是相關的子查詢。因為這樣會導致效率下降。\x0d\列的標簽同時出現在主查詢和where子句的查詢中,因此在主查詢中的列值更改後,很可能必須再次查詢子查詢。查詢的嵌套層次越多,效率越低,所以應該盡可能避免子查詢。如果子查詢不可避免,請在子查詢中篩選出盡可能多的行。\x0d\ 4。消除對大型表行數據的順序訪問\ x0d \在嵌套查詢中,對表的順序訪問可能會對查詢效率產生致命影響。\x0d\例如,如果采用順序訪問策略,嵌套壹個三層的查詢,如果每層查詢1000行,那麽該查詢將查詢1000億行數據。\x0d\避免這種情況的主要方法是對連接的列進行索引。\x0d\比如有兩個表:學生表(學號,姓名,年齡)和選課表(學號,課程號,年級)。如果要連接兩個表,需要在“學號”的連接字段上建立索引。\x0d\您也可以使用union來避免順序訪問。盡管所有檢查列上都有索引,但是某些形式的where子句會強制優化器使用順序訪問。\x0d\以下查詢將對orders表強制執行順序操作:\ x0d \ select * from orders where(customer _ num = 104,order _ num > 1001)或order_num = 1008 \ x0d \盡管customer _ num和order _ num上有索引,但在上面的語句中,優化器仍然使用順序訪問路徑來掃描整個表。因為此語句是為了檢索壹組分隔的行,所以應該將其更改為以下語句:\ x0d \ select * from orders where customer _ num = 104 and order _ num > 1001 \ x0d \ union \ x0d \ select * from order _ num = 1008 \ x0d \以便可以通過索引路徑處理查詢。\ x0d \ 5。避免困難的正則表達式\x0d\MATCHES和LIKE關鍵字支持通配符匹配,技術上稱為正則表達式。但是這種匹配特別耗時。例如:select * from customer where zip code like " 98 _ _ " \ x0d \即使在郵政編碼字段上建立了索引,在這種情況下,仍然采用順序掃描。如果將語句更改為select * from customer where zip code >;“98000”在執行查詢時會使用索引進行查詢,顯然會大大提高速度。\x0d\此外,避免非起始子字符串。例如,語句select * from customer where zip code[2,3 3]>“80”在where子句中使用了壹個非起始子字符串,因此該語句將不使用索引。\x0d\ 6。使用臨時表加快查詢速度\ x0d \對表的子集進行排序並創建臨時表有時可以加快查詢速度。它有助於避免多次排序操作,並簡化優化器在其他方面的工作。例如:\x0d\SELECT cust.name,rcvbles.balance,other COLUMNS \x0d\FROM cust,rcvbles \ x0d \其中cust . customer _ id = rcvlbes . customer _ id \ x0d \ AND rcvblls . balance > 0 \ x0d \ AND cust . postcode & gt;" 98000" \ x0d \按客戶排序。Name \ x0d \如果要多次執行此查詢,您可以找出所有未付款的客戶並將其放在壹個臨時文件中,然後按其名稱進行排序:\x0d\SELECT cust.name,rcvbles.balance,other COLUMNS \x0d\ FROM cust,rcvbles \ x0d \其中cust . customer _ id = rcv lbes . customer _ id \ x0d \ AND rcv bls . balance & gt;;0 \ x0d \ order by cust . name \ x0d \ into temp cust _ with _ balance \ x0d \然後在臨時表中按以下方式查詢:\ x0d \ select * from cust _ with _ balance \ x0d \ where postcode >在“98000”\ x0d \臨時表中的行數比主表中的少,物理順序為所需順序,減少了磁盤I/O,因此可以大大減少查詢工作量。\x0d\註意:主表的修改在臨時表創建後不會體現出來。當主表中的數據被頻繁修改時,註意不要丟失數據。\x0d\ 7。用排序代替非順序存取\ x0d \非順序磁盤存取是最慢的操作,表現在磁盤存取臂的來回移動。SQL語句隱藏了這種情況,使得我們在編寫應用程序時,很容易寫出需要訪問大量非順序頁面的查詢。