針對你的第一個問題,看起來你有反正規化的需求?不然同一個資料為什麼要存兩次?
針對第二個問題,是要看你的需求。在同一個網頁用到好幾個資料表並沒有什麼問題,如果有效率的考量(例如網頁產生時間很久,或是資料庫連結不敷使用),那首先考量的應該是:
每個查詢用到好幾個資料表是正常現象,通常不會有太大的效能問題,除非是大量資料跑分析報表又沒建好index。不過這一類需求,比較不建議用real time的方式產生,最好讓系統排程來做。
阿,忘了回第一個問題的做法:mysql5以後支援trigger
的確我是有大量資料的需求,之前我在做網頁設計的時候比較沒有考量到資料量的問題,結果就沿用先前所設計的資料表作連結查詢的動作,但是隨著此資料庫的各資料表的測試資料庫的資料越來越多的時侯,就會出現開啟網頁時變成越來越慢,所以現在解決的方案是將輸入頁面上面做了會同時輸入兩個資料表,一個是過去歷史資料的資料表,另一個就是永遠都只會是最新一筆資料的資料表,不知道這樣會不會讓網頁開啟速度變比較快一點。
建議你先用explain來查看你的sql語句,看看有什麼效能問題。然後根據你的查詢需求來建index,看看是否能解決問題。
有效能問題時,上面絕對是第一個要嘗試的。另外,我是不知道你是需要做怎樣的查詢,才會嚴重影響頁面開啟時間,如果資料沒有分頁的話(limit),透過分頁也可以解決一些問題。
fillano大
第一個問題的解答,請參考這篇
看起來他問的不是資料庫同步...
我是覺得還是要用trigger來做會比較快。
不過如果只把兩筆資料寫入兩個表,怎麼會很慢?不知道他怎麼設計的...這個我有點不太明白
其實你兩個問題都可以用 memcache 來解。
第一個問題,只需要把取資料的邏輯改為:
第二個問題,資料量大的 table 做 join,如果索引設定正確,速度一樣是秒殺的。但是不是有必要把大量資料往網頁送,就值得商確,得看user是不是需要一次看這麼資料,是不是可以分頁達成。假如是像匯出的功能,非得一次把所有資料 dump 到 client 端去,那就考慮在 php 程式開頭加個 ob_start("ob_gzhandler");
壓縮輸出會比較快。
若不是使用 php,就在 apache 加掛 mod_deflate 模組。
MySQL有個很方便的作法來限制每次顯示的筆數:例如,
select A.aaa,B.bbb
From A inner join B on A.ID = B.ID
Limit 0, 100
"Limit 開始列,結束列"若間距是100,每次就只取出100筆顯示於網頁。
希望對你有幫助!
1,2都有高手回覆了
小弟直接回覆你第三點
加快速度建INDEX是必備的,還可以把常用資料建VIEW,可加快"查詢"速度!!