優化你的 MySQL 數據庫運作

要提高一個 PHP 應用系統的效能,除了優化算法、原碼外,還有很多方面可以著手,資深軟件工程師 Mike Willbanks 發表了一篇文章討論優化 MySQL 數據庫的運作,包括懶惰連接、不做無謂的查詢、小心規劃數據庫結構等。雖然這篇文章針對 MySQL,不過提及的技巧在其他數據庫引擎上同樣有用。

應用程式層面的 SQL 效能

應用程式層面的 SQL 效能與 SQL 查詢的效能屬於不同的課題,這是有關如何在設計上使 SQL 與應用程式互相配合讓工作做得更好,Mike Willbanks 認為這方面的研究主要集中於如何降低查詢的次數,從而提高可擴展性和改善效能,不過,高的效能並不等於好的可擴展性,正如具有可擴展性並不等於有高的效能。以下有關應用層面的 SQL 效能建議,很多都已經在 Mike Willbanks 的個人網誌上討論過:

繼續閱讀

分開數據庫的好處

有些網頁寄存計劃提供數個甚至無限數據庫,什麼情況下我們需要超過一個數據庫?單一數據庫和分散數據庫有甚麼相對好處和缺點?

  • 無須在每一個表(table)的名稱前加上「前置名稱」(prefix)以識別不同應用系統的表,這樣表的名稱簡短了,程式的代碼也簡短了,開發人員也編寫的舒服點 ……
  • 容易管理不同系統的存取權限,把所有表放在同一個數據庫,論壇的程式可能會搞亂網誌的表,CMS 的程式可能可以讀取論壇的資料。分開了數據庫後便可以很容易地安排什麼系統可以讀/寫哪些數據庫。
  • 繼續閱讀

    SQL 注入攻擊新招

    相信很多 PHP 的開發者都認識 SQL 注入攻擊(SQL injection),我們之前在「不可不知的 PHP 安全技巧」也曾經介紹過,最近 Gareth Heyes 在他的個人網誌提到一種新的 SQL 注入攻擊招式,Gareth Heyes 稱它做「SQL 反射注入攻擊(reflected SQL injection)」,很多人可能都會忽略。

    當用戶把數據送來伺服器,我們都會把數據 escape,然後組合成 SQL 指令送給數據庫,這樣做的好處是即使用戶的數據包含數據庫的特殊字符,例如「’」、「%」,也不會破壞 SQL 指令的完整性和語法,從而做成保安上的漏洞,也保證儲存在數據庫的東西,與用戶輸入的東西完全一致。

    繼續閱讀

    PHP5, Sqlite 及 Windows

    Turn up the Crank 有一位作者分享他使用 PHP5、Sqlite、Windows 的經驗。作者需要一個數據庫儲存資料,由於涉及的資料處理工作很簡單,所以他選擇了 Sqlite,結果他發現:

  • SQLite 3 無法與 PHP 相容:他不斷遇到一個錯誤訊息「PHP Warning: sqlite_open() [function.sqlite-open]: file is encrypted or is not a database」,網上有關 Sqlite 3 與 PHP 共用的文件十分缺乏,最後他終於發現 PHP 尚未支援 SQLite 3,對於 SQLite 3 已經推出了超過兩年仍未得到 PHP 的支援,作者感到大惑不解。
  • PHP 與 SQLite 2 並不合作暢順:作者在放棄 SQLite 3 後轉而嘗試 SQLite 2,但發現 PHP 無法讀取他使用命令行建立的 SQLite 資料庫,在網絡上經過一番搜索後,他發現這個問題根本沒有解決方案。
  • SQLite 對於目錄權限的要求極度愚蠢:SQLite 要求資料庫的路徑中每一個目錄它都具備讀/寫權限,例如資料庫儲存在 D:\websites\site_1234\db.sqlite,執行 PHP 的帳號須具備 D:\websites\ 及 D:\websites\site_1234\ 的讀/寫權限,若過伺服器上同時運行多個網站,這肯定是一個極大的安全漏洞。
  • 繼續閱讀

    簡單易懂的介紹 SQL

    學習一種語言最有效的方法是多做練習,學習 SQL 也是一樣,A Gentle Introduction to SQL 是一個讓你實際輸入及執行 SQL 語句的教學網站,他們提供一些編寫 SQL 的有用技巧,大量不同深淺程度的練習(附有答案),還有小型專案給你盡情發揮你的 SQL 才華。

    這個網站提供多種語言版本,其中包括中文,但只有部分頁面完成翻譯,而且都是簡體字,但對於閱讀外語有困難的人不失為一個折衷方案。

    繼續閱讀

    在 PHP 數據庫應用中五種常見的錯誤

    數據庫跟其他工具一樣,若果不正確地使用,很容易出現濫用的情況,Jack Herrington 在一篇文章中說,你可以在 PHP 應用程式中建立數據庫、存取資料,然後在其上編寫商業邏輯,達成這些目標很有方法,可惜很多人仍然把事情弄糟。在這篇文章中他闡述數據庫設計,和存取數據 庫的 PHP 程式的五種常見毛病,還有如何避開這些毛病,文中並附有大量實例。這五種毛病是:

    毛病一:直接存取 MySQL

    繼續閱讀

    MySQL 預存程序入門教學

    Ligaya Turmelle 在 A/R/T 刊登了 MySQL 預存程序的教學文件的第一篇,Turmelle 在這篇文章首先介紹什麼是預存程序(Stored Procedure)與及預存程序的優點:

    基本上預存程序是用 SQL 語句寫成並儲存在數據庫的常式,例如你有一個給薪資應用程式專用的預存程序,它會檢示僱員的工時表格,計算每一個人的應得薪金,然後把資料寫入會計表格 中,最後計算僱員的休假總數,把所有資料在雇員表格中反映出來。倘若沒有預存程序應用系統便需要多次從數據庫送出及提取資料,有了預存程序所有運算便可以 一次過完成,然後把最後結果送回應用程式。

    繼續閱讀