PostgreSQL 對 NoSQL 的看法...

二月的時候 PostgreSQL 的人在 FOSDEM PGDay 2013 上發表了對 NoSQL 的看法 (PDF 投影片):「PostgreSQL as a Schemaless Database.」。

先說明,這投影片相當酸 XD

不過這份投影片說明了大多數人的問題:

  • 其實大多用 NoSQL 的人不知道在用什麼...
  • 就算你知道你在用什麼,你用得很爽的功能其實在「傳統的」「SQL 架構」下效能通常都會更好...

另外我建議可以看看維基百科上的 Entity-attribute-value model,大多數你想用 NoSQL 的情況在這個 case 下就可以解決,而且效能相當好。

換 NoSQL 前的建議...

原文是「Medium Data: things to try before abandoning SQL」,放棄 SQL 前應該要嘗試的事情,原文一開始就用粗體說明帶有強烈的偏見 XD

First, my thesis: a lot of less-experienced developers are using big data and NoSQL technologies because they are new and cool, and because SQL is old and hard. A lot of these people would save themselves time and effort by learning more about SQL and tuning their databases and hardware just a little bit.

文章寫的相當概念性,主要是說明幾件事情:

  • 其實 SQL 可以解決大部分的事情,大家都知道 SQL 的瓶頸在哪裡,有哪些 workaround 可以避開。
  • 不要因為 MySQL 做不到就覺得 SQL 不好用,在這種情況下,PostgreSQL 的功能與成熟度很值得看看。
  • 不要用 Oracle 官方版本的 MySQL... XD
  • 通常可以用 cache 解決的就用 cache 試著解看看,雖然 invalidate 問題不太好處哩... XD
  • 如果是 Read 數量太多,可以用 replication 解決不少問題。
  • 試著去理解 index 的「原理」,也就是資料結構,這對於要怎麼用 index 絕對有強力的幫助。
  • 當上面都做完而發現還是不夠的時候就 sharding 吧。

MariaDB 10.0.1...

MariaDB 發表 MariaDB 10.0.1 了:「What does MariaDB 10.0.1 include – available now」。

公告的文章把一些資訊整理出來讓大家與 MySQL 5.6 比較... XD

  • MariaDB 10.0-only Features:只有 MariaDB 10.0 有的功能。
  • MariaDB 10.0 Merged Features:從 MySQL 5.6 拉回來的功能。
  • MariaDB 10.0 Reimplemented Features:兩邊都有的功能,不過 MariaDB 自己重新實作了 (重寫)。
  • MariaDB 5.x Features now in MySQL 5.6:MySQL 5.6 從 MariaDB 5.x 拉的功能
  • MariaDB 5.x Features Backported from MySQL 5.6:MariaDB 5.x 從 MySQL 5.6 拉出來的功能。

然後沒有列出 MySQL 5.6 有,但是 MariaDB 沒有的功能... XD

先不管這些東西,10.0.1 多了 Cassandra storage engine 看起來就很有趣啊,可以透過 MySQL server 當 Cassandra client 跑去 Cassandra Cluster 讀寫資料:

看說明是透過 CQL 要資料,所以仍然是受限於 CQL 的能力。

在 PostgreSQL 裡分析 PostgreSQL mailing list 行為...

在「Analyzing PostgreSQL Email Archives with PostgreSQL」這篇文章看到的,用 PostgreSQL 所提供的功能找出一些資訊... (像是 full text search 的功能)

於是就產生出這樣的圖:(應該不用解釋?)

還有「Probability that a new thread gets a response」或是與 Competitors 相關的統計 XD

請僅快確認這次 RoR 所提供的安全性公告

下午遇到布丁大長輩的時候他還很開心說「我用 2.3 沒問題的啊~」XDDD

今天 Ruby on Rails 官方對 Active Record 發出安全性通報以及更新 (類別為 SQL Injection):「[ANN] Rails 3.2.10, 3.1.9, and 3.0.18 have been released!」。

請不要只看標題,這次的安全性問題包括所有版本,而非 3.x 而已。這次的安全性問題太過歡樂,所以除了在支援的版本以外 (3.1 與 3.2),這次的安全性問題還是提供了 2.3 與 3.0 的 patch 讓人下載,並提供當無法使用 patch 時的 workaround:「SQL Injection Vulnerability in Ruby on Rails (CVE-2012-5664)」。

MySQL 內 JOIN 的應用...

Common use cases for the MySQL Join statement」這篇給的範例與把 MySQL 上常用到的幾種 JOIN 提出來分析,包括 index 與 explain。另外在「Managing hierarchical data with MySQL」也提到了要怎麼處理階層式資料。

對於 JOIN 大概分幾個階段:

  • 在使用 MyISAM 的時候會儘量避免 JOIN,因為當 SQL 執行時間久的時候會有好幾個 table 同時卡住無法寫入。
  • 改用 InnoDB 後一直用 JOIN,不論是報表或是 web SQL query,造成 CPU bound (雖然不是 table lock,但在 MVCC 架構下,讀取也還是有 lock 成本存在)。
  • 把 JOIN 形式的 web SQL query 拆成多個 SQL query 以降低 lock 成本;針對計算成本很高的結果 cache,再針對 cache 效果不佳的表格逆正規化。只有報表不受限使用 JOIN。

後面的階段則是 data sharding 與 NoSQL。不過每個階段的界線不是那麼明顯,有時候會重疊在一起...

說到逆正規化,MariaDBVirtual Columns + PERSIST 好像是逆正規化的好工具,再來測仔細一點...

看 Mozilla Database Team 的年終報告...

有時候除了可以看介紹新技術的文章學東西外,報告類的文章也可以看得出來目前的趨勢。

像是 Mozilla Database Team 的年終報告描述近況與最後這季做了哪些事情「December News from the Mozilla Database Team」:

  • 之前還在用 MySQL 5.0,現在 Migrate 到 5.1 了,另外正在嘗試 MariaDB 5.5。
  • 很大一部分是在 tune Bugzilla 的效能,包括 SQL query optimization,以及 data partition 計畫。
  • 測試 SSD 覺得不錯,看起來好像也測過 Fusion-io 的產品,不過價錢不太能接受?

另外還有一些 PostgreSQL 的說明,看起來還沒穩下來...

目前已經看到維基百科與 Mozilla 都在嘗試 MariaDB,看了看 MariaDB versus MySQL - Features 發現有趣的東西還不少,除了 Aria 以外,Virtual ColumnsDynamic columns 似乎都是有趣的東西...

花時間看看 PostgreSQL...

雖然工作上都還是用 MySQL,但還是來看看其他的 database... 印象中對 PostgreSQL 最主要的差異 (與 MySQL 相比較) 是在於 index 的彈性...

PostgreSQL 也是個超大的 open source project,所以除了可以到 PostgreSQL 的官方網站找資料外,英文版維基百科上的資料也是對於熟悉 PostgreSQL 的入口:「PostgreSQL - Wikipedia, the free encyclopedia」。

現在 PostgreSQL 最新的 stable 版本是 9.1。依照 Versioning policy 文件,從第一個 major 版本釋出後,提供五年的軟體支援。現在支援的版本包括 8.3、8.4、9.0 與 9.1。另外最近剛出 9.2 beta1,在「PostgreSQL 9.2 Beta 1 Available for Testing」有些說明可以看。

功能面上,除了本來就很強的功能外,內建 Replication 是從 9.0 開始,其中 9.0 與 9.1 分別支援 async replication 與 sync replication,9.2 則是多了 Cascading replication (應該是指串接)。

商業支援則是常常可以看到 EnterpriseDB。有名的用戶包括了 InstagramHeroku

接下來就是實際玩看看...

PHP 長期計畫:廢除 ext/mysql,改用 pdo_mysql 或 mysqli

Hacker News 上看到的長期計畫,要廢除 ext/mysql:「deprecating ext/mysql」。

主要的原因是 security 習慣問題。因為 ext/mysql 不支援 prepare 與 execute 這類不需要自己處理 escape 的函式,所以使用 ext/mysql 的人必須自己處理 escape 的問題,也就是透過 mysql_escape_string 或是 mysql_real_escape_string。而很多書籍為了讓初學者容易了解,會給出很糟的範例,像是:

mysql_query("SELECT * FROM `user` WHERE `username` = '$username';");

$username 沒有先檢查過。

依照提議,目前只會在文件上建議改用 PDO 或是 mysqli,不會對目前版本有任何改變。接下來是 5.5 與 6.0 時會看情況決定要不要加上 E_DEPRECATED

目前的提議還沒有提到何時要拔掉 ext/mysql,不過看起來 6.0 之前應該是不會做...