數據庫聯合查詢的思考

今天無意間看到這篇文章,轉載下來,做個驗證,試驗下。

轉自:http://forchenyun.iteye.com/blog/473775


昨天晚上和網友討論了一個關於數據庫聯合查詢的效率的問題.說實話,以前我一直沒怎麼考慮過這個問題,在寫SQL時,都沒怎麼考慮,似乎一切都成了習慣,或者已經懶散貫了,但是,網友和我聊起來了,我也就好好考慮起這個問題了,平時不考慮時不知道,真正好好計較一下,才發現還有很多門道.

假設我們有三個表,A表,B表,C表.其數據量分別爲100,200,300條記錄.並且假設每次都是完全遍歷所有數據才找到結果(其實一般情況下不會真的需要完全遍歷完才能找到結果),並且假設不考慮索引,當然,就算不排除這些因素,結果比例還是一樣的,只是數據大小上有點不一樣.並且假設每次查詢都查出10個結果.


一般我們的查詢語句是這樣的:

select * from a,b,c where a.id=b.aid and b.id=c.bid

那這些的查詢效率大概是怎樣的呢?它相當於先將這三表進行組合,再遍歷查詢,查詢量爲100*200*300=600萬.好像很嚇人,這只是1,2,3百的三個表,如果個1,2,3百萬,千萬呢,那是不是很恐怖呢?


那我們應該如何進行優化呢?依我的理解,可以不使用三表聯合查詢,分成多個查詢,過濾大量的數據再進行聯合,這樣的話,再聯合時,就可以大量減少遍歷次數,比如以下方式:

方式1: 將三表聯合分成兩個2表聯合查詢,如:先進行AB聯合查詢,再將結果與C聯合. 這樣查詢遍歷次數爲:100*200+10*300 =2.3萬.

類似的SQL爲: select * from (select * from a, b where a.id = b.aid) as ab, cwhere ab.id=c.bid

方式2:先對各表進行過濾,再進行三表聯合,或者2表聯合: 這樣查詢的遍歷次數爲:100+200+300+10*10*10=1600.,或者:100+200+300+10*10+10*10=800.

類似的SQL爲: select * from (select * from a where ...)as a,(select * from b where ....) as b, (select * from c where ....) as cwhere a.id=b.aid and b.id=c.bid

或者: select * from (select * from (select * from a where ...)as a,(select * from b where ....) as b where a.id = b.aid) as ab, (select * from c where ....) as cwhere ab.id=c.bid


根據以上的思考,結果很嚇人,經過對比,發現,結果好恐怖,遍歷次數差別簡直就是.........比比看看:600萬--2.3萬--1600--800,這種比例實在太恐怖了,我不得不對聯合查詢產生了動搖,難道我們爲聯合查詢的便利,就付出如此巨大的浪費嗎?我們真的應該重新審視一下,我們平時已經習慣的編程習慣,以及那些我們認爲理所當然的代碼.

當然,以上的計算,有着很多的假定在裏面,實際的結果,在不同的數據量,不同的數據庫,不同的數據面前,都會有很大的差異,但是,不可否認聯合查詢的效率,確實不容樂觀,如果有需要優化數據查詢,特別是大數據量的情況下,很值得思考.

以上只是我的思考,並不代表事實就如此,也許,我一開始的思維方式就錯了,如果你有想法,請給我評論時提出,有時間我們一起去驗證一下.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章