使用「垂直分割」技術(見下一條),你可以分割你的表成為兩個乙個是定長的,乙個則是不定長的。
16. 垂直分割
「垂直分割」是一種把資料庫中的表按列變成幾張表的方法,這樣可以降低表的複雜度和字段的數目,從而達到優化的目的。
(以前,在銀行做過專案,見過一張表有100多個字段,很恐怖)
示例一:在users表中有乙個欄位是家庭位址,這個欄位是可選字段,相比起,而且你在資料庫操作的時候除了個人資訊外,
你並不需要經常讀取或是改寫這個字段。那麼,為什麼不把他放到另外一張表中呢?
這樣會讓你的表有更好的效能,大家想想是不是,大量的時候,我對於使用者表來說,
只有使用者id,使用者名稱,口令,使用者角色等會被經常使用。小一點的表總是會有好的效能。
示例二: 你有乙個叫 「last_login」 的字段,它會在每次使用者登入時被更新。
但是,每次更新時會導致該錶的查詢快取被清空。所以,你可以把這個字段放到另乙個表中,
這樣就不會影響你對使用者id,使用者名稱,使用者角色的不停地讀取了,因為查詢快取會幫你增加很多效能。
另外,你需要注意的是,這些被分出去的字段所形成的表,你不會經常性地去join他們,不然的話,這樣的效能會比不分割時還要差,而且,會是極數級的下降。
17. 拆分大的 delete 或 insert 語句
apache 會有很多的子程序或執行緒。所以,其工作起來相當有效率,而我們的伺服器也不希望有太多的子程序,
執行緒和資料庫鏈結,這是極大的佔伺服器資源的事情,尤其是記憶體。
如果你把你的表鎖上一段時間,比如30秒鐘,那麼對於乙個有很高訪問量的站點來說,
這30秒所積累的訪問程序/執行緒,資料庫鏈結,開啟的檔案數,可能不僅僅會讓你泊web服務crash,
還可能會讓你的整台伺服器馬上掛了。
while (1)
// 每次都要休息一會兒
usleep(50000);
}18. 越小的列會越快
對於大多數的資料庫引擎來說,硬碟操作可能是最重大的瓶頸。
所以,把你的資料變得緊湊會對這種情況非常有幫助,因為這減少了對硬碟的訪問。
參看 mysql 的文件 storage requirements 檢視所有的資料型別。
如果乙個表只會有幾列罷了(比如說字典表,配置表),那麼,我們就沒有理由使用 int 來做主鍵,
使用 mediumint, smallint 或是更小的 tinyint 會更經濟一些。
如果你不需要記錄時間,使用 date 要比 datetime 好得多。
當然,你也需要留夠足夠的擴充套件空間,不然,你日後來幹這個事,你會死的很難看,
參看slashdot的例子(2023年11月06日),乙個簡單的alter table語句花了3個多小時,因為裡面有一千六百萬條資料。
19. 選擇正確的儲存引擎
在 mysql 中有兩個儲存引擎 myisam 和 innodb,每個引擎都有利有弊。
酷殼以前文章《mysql: innodb 還是 myisam?》討論和這個事情。
myisam 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。
甚至你只是需要update乙個字段,整個表都會被鎖起來,而別的程序,就算是讀程序都無法操作直到讀操作完成。
另外,myisam 對於 select count(*) 這類的計算是超快無比的。
innodb 的趨勢會是乙個非常複雜的儲存引擎,對於一些小的應用,它會比 myisam 還慢。
他是它支援「行鎖」 ,於是在寫操作比較多的時候,會更優秀。並且,他還支援更多的高階應用,比如:事務。
21. 小心「永久鏈結」
「永久鏈結」的目的是用來減少重新建立mysql鏈結的次數。當乙個鏈結被建立了,它會永遠處在連線的狀態,
就算是資料庫操作已經結束了。而且,自從我們的apache開始重用它的子程序後——也就是說,
下一次的http請求會重用apache的子程序,並重用相同的 mysql 鏈結。
php手冊:mysql_pconnect()
在理論上來說,這聽起來非常的不錯。但是從個人經驗(也是大多數人的)上來說,這個功能製造出來的麻煩事更多。因為,你只有有限的鏈結數,記憶體問題,檔案控制代碼數,等等。
而且,apache 執行在極端並行的環境中,會建立很多很多的了程序。
這就是為什麼這種「永久鏈結」的機制工作地不好的原因。在你決定要使用「永久鏈結」之前,
你需要好好地考慮一下你的整個系統的架構。
年末的CD收穫
年末慢慢積累,還買了不少的一批古典。博雅進了幾個系列的經典碟,我也就挑經典之經典收入囊中。rca的全集系列 白底色紙盒 基本都是60 張,不算便宜,不過有兩套不錯,乙個是toscanini指揮nbc交響樂團的貝多芬全集,5張,相比伯恩斯坦的不算節約也不算奢侈 一套是larrocha的莫扎特鋼琴奏鳴曲...
怎樣做好年末總結
又到年尾,很多公司都要做年終總結,軟體企業怎麼做好年終總結?具體到開發部門,可從哪些方面入手?如何通過總結來帶動來年的工作和員工士氣?就這些問題,程式設計師 雜誌社約請我談談自己的看法。下面是我的簡短回答,刊登在 程式設計師 雜誌2009年第11期。年終總結 成績要講透,不足之處要講明 來年規劃要清...
年末的簡單回想
天天上班,加班,主要就是趕時間吃飯和睡覺,不知不覺的傳說中的2012馬上就要來了。不管到時是地球要爆,還是太陽要爆,還是抽點時間想想今年的得失吧。因為快要過去的2011可是俺的第二個本命年哩,讓人鬱悶的是在2010年末時我本以為2011要不平凡的,如今再過兩天就過完了,還是平平淡淡的,也不知道是不是...