對於一個網站來講,數據庫的結構相當重要。即要利於存儲(入庫不阻塞),又要利於查詢(查詢不鎖表)。網站數據庫優化經驗是一個積累的過程。下面就對多表關聯查詢的優化方法,舉例說明。 mysql
如今社區分享類網站很火,就拿方維購物分享網站舉例說明吧。也是對二次開發方維購物分享網站的一點總結,高手能夠飛過。 sql
購物分享的關鍵表有:分享表、圖片表、文件表、評論表、標籤表、分類表等。
圍繞分享的表就麼多,哇,那也很多啊。當咱們查看一個圖片的詳細信息時,就要顯示以上表裏的信息。顯示圖片所屬的分類、給圖片打的標籤、圖片的評論、有文件的話還要顯示文件下載信息等。難道讓咱們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( tag1 tag2 ...... ), '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;
這樣查詢就變得簡單了,只須要查詢一條就好了,取到緩存字段,把其反序列化,把數組信息提取出來,而後顯示到頁面。若是是之前那個結構,在幾十萬的數據量下,估計早崩潰了。數據緩存的方法也許不是最好的,若是你有更好的方法,能夠相互學習,相互討論。 緩存
本文由PHP樂知博客提供 http://tech.42xiu.com 學習