如何優化操作大資料量資料庫(幾十

2021-06-26 11:50:25 字數 1751 閱讀 4010

聚集索引的重要性和如何選擇聚集索引

在上一節的標題中,筆者寫的是:實現小資料量和海量資料的通用分頁顯示儲存過程。這是因為在將本儲存過程應用於「辦公自動化」系統的實踐中時,筆者發現這第三種儲存過程在小資料量的情況下,有如下現象:

1、分頁速度一般維持在1秒和3秒之間。

2、在查詢最後一頁時,速度一般為5秒至8秒,哪怕分頁總數只有3頁或30萬頁。

雖然在超大容量情況下,這個分頁的實現過程是很快的,但在分前幾頁時,這個1-3秒的速度比起第一種甚至沒有經過優化的分頁方法速度還要慢,借使用者的話說就是「還沒有access資料庫速度快」,這個認識足以導致使用者放棄使用您開發的系統。

筆者就此分析了一下,原來產生這種現象的癥結是如此的簡單,但又如此的重要:排序的字段不是聚集索引!

本篇文章的題目是:「查詢優化及分頁演算法方案」。筆者只所以把「查詢優化」和「分頁演算法」這兩個聯絡不是很大的論題放在一起,就是因為二者都需要乙個非常重要的東西――聚集索引。

在前面的討論中我們已經提到了,聚集索引有兩個最大的優勢:

1、以最快的速度縮小查詢範圍。

2、以最快的速度進行字段排序。

第1條多用在查詢優化時,而第2條多用在進行分頁時的資料排序。

而聚集索引在每個表內又只能建立乙個,這使得聚集索引顯得更加的重要。聚集索引的挑選可以說是實現「查詢優化」和「高效分頁」的最關鍵因素。

但要既使聚集索引列既符合查詢列的需要,又符合排序列的需要,這通常是乙個矛盾。

筆者前面「索引」的討論中,將fariqi,即使用者發文日期作為了聚集索引的起始列,日期的精確度為「日」。這種作法的優點,前面已經提到了,在進行劃時間段的快速查詢中,比用id主鍵列有很大的優勢。

但在分頁時,由於這個聚集索引列存在著重覆記錄,所以無法使用max或min來最為分頁的參照物,進而無法實現更為高效的排序。而如果將id主鍵列作為聚集索引,那麼聚集索引除了用以排序之外,沒有任何用處,實際上是浪費了聚集索引這個寶貴的資源。

為解決這個矛盾,筆者後來又新增了乙個日期列,其預設值為getdate()。使用者在寫入記錄時,這個列自動寫入當時的時間,時間精確到毫秒。即使這樣,為了避免可能性很小的重合,還要在此列上建立unique約束。將此日期列作為聚集索引列。

有了這個時間型聚集索引列之後,使用者就既可以用這個列查詢使用者在插入資料時的某個時間段的查詢,又可以作為唯一列來實現max或min,成為分頁演算法的參照物。

經過這樣的優化,筆者發現,無論是大資料量的情況下還是小資料量的情況下,分頁速度一般都是幾十毫秒,甚至0毫秒。而用日期段縮小範圍的查詢速度比原來也沒有任何遲鈍。

聚集索引是如此的重要和珍貴,所以筆者總結了一下,一定要將聚集索引建立在:

1、您最頻繁使用的、用以縮小查詢範圍的字段上;

2、您最頻繁使用的、需要排序的字段上。

結束語:

希望這篇文章不僅能夠給大家的工作帶來一定的幫助,也希望能讓大家能夠體會到分析問題的方法;最重要的是,希望這篇文章能夠拋磚引玉,掀起大家的學習和討論的興趣,以共同促進。

最後需要說明的是,在試驗中,發現使用者在進行大資料量查詢的時候,對資料庫速度影響最大的不是記憶體大小,而是cpu。在我的p4 2.4機器上試驗的時候,檢視「資源管理器」,cpu經常出現持續到100%的現象,而記憶體用量卻並沒有改變或者說沒有大的改變。即使在我們的hp ml 350 g3伺服器上試驗時,cpu峰值也能達到90%,一般持續在70%左右。

本文的試驗資料都是來自我們的hp ml 350伺服器。伺服器配置:雙inter xeon 超執行緒 cpu 2.4g,記憶體1g,作業系統windows server 2003 enterprise edition,資料庫sql server 2000 sp3

大資料量分頁優化

用limit offset 時並不是先跳過再查詢 而是 先查詢,再跳過 limit 100w,10 先把100w取出來,然後跳過前100w行,所以大資料分頁用limit很慢 select id,name from lx com 5000000,10 先查詢出來5000000 select id,na...

航測大資料量處理 大資料量處理及優化措施

1 首先考慮垂直拆分庫,不同的表拆分到不同的庫中,例如使用者庫 產品庫 支付庫 2 然後考慮水平拆分庫,將乙個表的資料放到多張表中,例如按照使用者 時間 訂單號 3 插入資料的時候不建立索引 4 待資料已經插入完成後,建立索引 5 正確的指定索引字段 6 使用批量插入資料庫的方式代替單條資料的插入 ...

大資料量下的資料庫日期操作問題

說明 以下資料庫操作基於sql server 2000 問題出現 select top 50 newsid,newstitle,newsread from newstable where datediff d newstime,getdate 7 order by newsread desc只要對n...