標籤:
對於一個網站來說,資料庫的結構至關重要。即要利於儲存(入庫不阻塞),又要利於查詢(查詢不鎖表)。網站資料庫最佳化經驗是一個積累的過程。下面就對多表關聯查詢的最佳化方法,舉例說明。
現在社區分享類網站很火,就拿方維購物分享網站舉例說明吧。也是對二次開發方維購物分享網站的一點總結,高手可以飛過。
購物分享的關鍵表有:分享表、圖片表、檔案表、評論表、標籤表、分類表等。
圍繞分享的表就麼多,哇,那也不少啊。當我們查看一個圖片的詳細資料時,就要顯示以上表裡的資訊。顯示圖片所屬的分類、給圖片打的標籤、圖片的評論、有檔案的話還要顯示檔案下載資訊等。難道讓我們6個表去關聯查詢嘛,當然不能這麼多關聯來查詢資料,我們可以只查詢一個表即可,這怎麼講?這裡分享表是主表,我們可以在主表裡建立一個緩衝欄位。比如我們叫cache_data欄位,賦予它text類型,這樣可以儲存很長的字串,而不至於超過欄位的最大儲存。
這個緩衝欄位怎麼用呢?在新增一條分享資訊後,產生分享ID。如果使用者發布圖片或檔案的話,圖片資訊入圖片表,檔案資訊入檔案表,然後把新產生的圖片或檔案資訊寫入到緩衝欄位裡。同樣的,如果使用者有選擇分類、打了標籤的話,也把相應的資訊寫入到緩衝欄位裡。對於評論而言,沒有必要把全部評論存到緩衝欄位裡,因為你不知道他有多少條記錄,可以把最新的10條存到緩衝欄位裡用於顯示,這樣緩衝欄位就變成一個二維或三維數組,序列化後儲存到分享表裡。
array(‘img‘ = array(name => ‘123.jpg‘,url => ‘http://tech.42xiu.com/123.jpg‘,width => 800,width => 600,),‘file‘ = array(name => ‘abc.zip‘,download_url => ‘http://tech.42xiu.com/abc.zip‘,size => 1.2Mb,),‘category‘ = array(1 => array(id => 5,name => PHP樂知部落格),2 => array(id => 6,name => PHP技術部落格),),‘tag‘ => array(tag1tag2......),‘message‘ => array(1 => array(id, uid, name, content, time),2 => array(id, uid, name, content, time),3 => array(id, uid, name, content, time),4 => array(id, uid, name, content, time),),)//比如,上面的數組結構,序列化存入資料庫。UPDATE share SET cache_data=mysql_real_escape_string(serialize($cache_data)) WHERE id=1;
這樣查詢就變得簡單了,只需要查詢一條就行了,取到緩衝欄位,把其還原序列化,把數組資訊提取出來,然後顯示到頁面。如果是以前那個結構,在幾十萬的資料量下,估計早崩潰了。資料緩衝的方法也許不是最好的,如果你有更好的方法,可以相互學習,相互討論。
mark---[mysql多表關聯查詢的最佳化方法]