私がフリーのSQLデータベースを選択する場合、MariaDB/PostgreSQLを採用することが多い。 この記事では改めて両者を比較してみる。
#正規表現(regexp_replace)
大きな差はない。PostgreSQLの正規表現がフラグなどがPerl等のプログラミング言語に採用されている正規表現に近く馴染みやすい。MariaDBのそれは少し異なる。
-
MariaDB https://mariadb.com/kb/en/library/regexp_replace/
構文:REGEXP_REPLACE(subject, pattern, replace) -
PostgreSQL https://www.postgresql.jp/document/10/html/functions-matching.html
構文:regexp_replace(source, pattern, replacement [, flags ])
#メモリストレージエンジン と UNLOGGEDテーブル
MariaDBはデータベースエンジンを選択できる。これにはPostgreSQLにはないメモリだけのデータベースであるメモリストレージエンジンを選択することが出来る。もちろん物理メモリを消費するので大きなテーブルはできないが、速度は圧倒的である。一方PostgreSQLには、UNLOGGED TABLEと呼ばれるジャーナルを作らないテーブルを作ることが出来る。一般のテーブルと比べると信用性が落ちるものの、これも高速動作する。使い勝手は容量を気にせず使えるUNLOGGED TABLEの方が良い。メモリストレージエンジンの場合、BLOB型とTEXT型は使えない点には注意が必要だ。
- MariaDB
CREATE TABLE test (id int, v varchar(10) ) ENGINE = MEMORY;
- PostgreSQL
CREATE UNLOGGED TABLE test (id int, v text);
#ストアード・プロシージャ
ストアード・プロシージャの自由度はPostgreSQLの方が高い。例えば、MariaDBではストアド・プロシージャの入力にテーブルを扱うことができない。結局、一時テーブル(TEMPORARY TABLE)を経由することになるので、PostgreSQLと比べると使いにくい。一時ビュー(TEMPORARY VIEW)があれば、まだマシだったかもしれないがそれもない。その他PostgreSQLのストアード・プロシージャにはPerlやPythonを用いることが出来る。
#パラレルクエリー
PostgreSQLにはパラレルクエリーと呼ばれる一つのクエリーを複数のスレッドで処理する機能が実装されている。使いこなすのは難しいが、クエリーを高速にすることができる。MariaDBで同様のことをする場合、呼び出し側で処理を分割し複数プロセスから複数のクエリーを実行する必要がある。逆に言えば、マルチプロセス・マルチスレッドに対応できない言語(標準のPHPなど)で、パラレルクエリーと同様の性能を出すことはできない。パラレルクエリーはOracleやMS-SQLServerにも実装されている。
#MySQL
MySQLにも少し触れる。商用SQLデータベースの大手のORACLEが著作権・商標権をもっていることやライセンスやの問題から、昨今のLinuxの各ディストリビューションではMySQLから派生したMariaDBが採用されていることが多い。私もMySQLはあまり使用していない。正規表現関連の実装も遅れてregexp_replaceは、MySQL8からの実装になった。また、MySQL8はMariaDBと互換性がない。MariaDBと完全に互換性があるのは、MySQL5.Xまでである。MySQL8を採用する場合はこの点にも注意が必要だ。
#まとめと考察
性能的な評価はしていないが、使いやすいのはPostgreSQLだと考える。もしカリカリに調整が必要なくらいパフォーマンスが要求される場合は、OracleやMS-SQLServerも選択肢に入れてもいいのではないだろうか。