公開日:2019/10/2
更新日:2019/10/2
キーワード:RDBMS 比較
文字数:11900(読み終わるまでおよそ20分)
この記事でわかること
- 「PostgreSQL」「MySQL」「SQLite」の性能比較
- 「PostgreSQL」「MySQL」「SQLite」のインストール方法
はじめに
RDBMS(リレーション・データベース・マネージメント・システム)には有償、無償を含めて様々な種類のものがあります。有償では「Oracle」、「Microsoft SQL Server」が有名です。
また、無償では「PostgreSQL」、「MySQL」、「SQLite」などがメジャーです。(MySQLは一部のパッケージが有償)
このページでは、オープンソースRDBMSである「PostgreSQL」、「MySQL」、「SQLite」の3つを紹介していきます。また、それらの性能比較、インストール方法も載せますので、興味のある方はぜひ最後までご覧いただければと思います。
1. PostgreSQLについて
1) 概要
PostgreSQLは「ポストグレエスキューエル」と読みます。
略して、「ポスグレ」と呼ぶこともあります。
PostgreSQLは、商用製品と同等の機能と性能を誇る、オープンソースのRDBMSです。
◆PostgreSQL 開発元のサイト
https://www.postgresql.org/
◆日本 PostgreSQL ユーザ会
https://www.postgresql.jp
2) 基本説明
RDBMSにオブジェクト指向概念を導入した「ORDBMS」の代表的な製品です。
商用製品「Oracle」と機能が近いこともあり、主に企業情報システムのデータベースなどとして採用されています。
比較的少ないハードウェアリソースで動作するなどのメリットがあり、Apacheなどと組み合わせて高機能Webサーバーと連携させて使用されることが多いです。
①プラットフォーム
Unix系(FreeBSD、OpenBSD、Linux、macOS、Solaris)および、Microsoft Windowsなどで動作可能です。
②接続可能な言語
C、C++、Java、.NET (C#, VB)、OleDB、Perl、Python、PHP、Rubyなど適切なインターフェイスを用いることでPostgreSQLと接続できます。
3) 市場シェア
DB-Engines.comによるマーケットシェア調査では、2019年9月現在、Oracle、MySQL、Microsoft SQL Server に続いて4位です。
参考:https://db-engines.com/en/ranking
4) 主な特徴、利点
①標準SQLへの準拠
PostgreSQLのSQLインタフェースは、極力独自構文の記述を抑え、ISO/IECの標準SQLにならった実装になっています。
他の主要なRDBMSは独自の書き方が比較的多く、そこでしか扱えない記述が多いです。これのなにがダメかというと、例えばRDBMSを他のものにしたいなと思ったさい、標準SQL以外の記述が多いと修正が多くなってしまうからです。
その点、PostgreSQLはそのような方言が少ないので、移植が容易だということです。
事実、「Oracle」からオープンソースRDBMSへの移行は、PostgreSQLが多くなっています。
②日本語に対応
マルチバイトコードに対応しているので、日本語にも対応していることになります。
LIKEや正規表現によるマルチバイト検索もサポートしています。
ver8.3ではJIS X 0213(JIS2004) にいち早く対応することで完全な日本語環境を提供しました。
③多機能
PostgreSQLは、関数(ストアドファンクション)、トランザクション、サブクエリ、トリガなど有償RDBMSの持つほとんどの機能を搭載しています。また、ユーザ定義型、継承など、他の製品ではあまり見かけない機能も持ち合わせています。
④地理情報システム (GIS)との連携
PostGISというアドオンソフトは、PostgreSQLと組み合わせて使うと地理情報システム(GIS)のデータをDBに格納することが可能です。これは2019年時点ではPostgreSQLだけの優位点であり、MySQLには適応されていません。
⑤並列実行性能に重点
CPU 数が増えた場合でもスケーラビリティが高く維持され、そして接続数が増えても性能が持続します。追記型のデータ構造も、並列実行性能を高めるための仕組みとなっています。
捕捉として、追記型アーキテクチャによりバキュームと呼ばれる処理が多くなりがちになってしまいます。バキュームとは、DBの更新、削除が行われることによる不要領域を解放することです。
分かりやすく、ゴミをお掃除すると考えても良いです。
これまでは追記型による性能向上と、バキュームによる面倒くささがトレードオフみたいな側面がありましたが、ver8.3からはHeap-Only Tuples (HOT) が採用され、インデックスの変更を伴わない更新については、削除された行を直ちに再利用することが可能となり、バキュームの必要な頻度は下がりました。
⑥BSDライセンスの採用
PostgreSQLは著作権の表示と免責条項さえ明記しておけば、再利用も再配布も自由な「BSDライセンス」を採用しています。これにより、企業で自社製品へ改変して組み込んだり、独自のソフトウェアを展開したりできます。
「オープンソースなんだから当たり前でしょ?」と思われるかもしれませんが、一方、MySQLの無償版は「GPL」というライセンスを適用しています。(「GPL」についてはMySQLの章で説明します。)
このGPLには事細かな規約があり、知らないうちに規約違反をしてしまう可能性があります。
厳密にはそこらへんが取り締まられたことはほとんどなく、なあなあで済ませられている部分ではありますが、無駄なリスクを犯したくないユーザーの方もいるでしょう。
その点、PostgreSQLは如何様にも利用して良いという「ライセンスの緩さ」が大きな利点の一つです。
5) PostgreSQLを導入している企業
- 株式会社日立ソリューションズ
- 株式会社NTTデータCCS
- 株式会社カプコン
など
2. MySQLについて
1) 概要
MySQLは「マイエスキューエル」と読みます。
MySQL は高速性と堅牢性を追及したマルチユーザ・マルチスレッドのRDBMSです。
また、世界で最も人気のあるオープンソースデータベースです。
◆MySQL 開発元のサイト
https://www.mysql.com/
◆日本 MySQL ユーザ会
http://www.mysql.gr.jp
2) 基本説明
MySQLは、高速処理性能や高い堅牢性に定評があります。
初期バージョンでは機能面に若干の不安がありましたが、多くのバージョンアップが繰り返さた結果、各種機能強化や機能追加が行われ、現在では商用製品と比較しても遜色のないデータベース製品となっています。
MySQLは、オラクル社によって開発やソースコード管理が行われています。
オラクル社から有償版(「MySQL Standard Edition」など)と、無償版「MySQL Community Server」の2種類が提供されています。
①プラットフォーム
Unix系(FreeBSD、OpenBSD、Linux、macOS、Solaris)および、Microsoft Windowsなどで動作可能です。
②接続可能な言語
C、C++、Eiffel、Smalltalk、Java、LISP、Perl、PHP、Python、Ruby、Tclなど適切なインターフェイスを用いることでMySQLと接続できます。
3) 市場シェア
DB-Engines.comによるマーケットシェア調査では、2019年9月現在、Oracleに続いて2位です。
しかも1位との差は僅差なので、数年後には順位が入れ替わっているかもしれません。
参考:https://db-engines.com/en/ranking
4) 主な特徴、利点
①世界的に圧倒的なシャアを誇っている
前述しましたが、MySQLは全世界で最も多く使用されているオープンソースです。
これのなにが有利かというと、MySQLについての情報がそれだけネット上に多く存在するということです。
もし、システム開発にMySQLを採用し、なにかの不具合にハマってしまったとしても、シェアが広いとそれを解決する情報が手に入る可能性が高くなります。
マイナーなRDBMSだと、情報が手に入らず無駄に苦労するシーンもでてくるでしょう。
MySQLでは、その心配がほとんどないと言ってもよいです。
②日本語に対応
MySQLは、sjis (Shift_JIS)、cp932(Microsoftコードページ932)、utf8(UTF-8)、utf8mb4(UTF-8(4バイトまで/MySQL5.5以降でサポート))、ujis (EUC-JP) といった文字セットを指定することで、日本語の文字を含む入出力を正しく扱うことができます。
③機能面の充実
ver4.1以降には副次問い合わせ(サブクエリ)が、そしてver5.0以降にはSQL99にストアドプロシージャ、ビュー、トリガーが実装されました。またver8.0ではウインドウ関数と共通表式(CTE: Common Table Expression)が実装されました。
加えて、標準でマスタスレーブ方式のレプリケーション機能を備えており、堅牢なデータストレージの構築がほかと比べて比較的容易であるといえます。
④マルチスレッド処理
ver5.6でSQLスレッドを複数化する機能が加わりましたが、スレッドを複数化する単位がデータベースごとという制約があり、使い勝手が悪いという背景がありました。
ver5.7以降はその制約がなくなり、例え同じデータベース内のテーブルを更新する場合であっても、複数のスレッドによって処理が走るようになりました。
⑤デュアルライセンス方式の採用
MySQLは GPL とコマーシャルライセンスのデュアルライセンス方式で提供されています。
基本的に、MySQLのサーバ本体とクライアントライブラリはGPLで提供されるので、MySQLを改造したり、それを再頒布する場合は、GPLの規約に従う必要があります。
GPLのクライアントライブラリを利用してMySQLに接続するアプリケーションを開発した場合、そのアプリケーションもGPLライセンスとしなければならない可能性があるということになります。
ただし、クライアントライブラリに関しては、アプリケーションが既定のオープンソースライセンスで公開されるのであれば、GPL以外のオープンソースライセンスで再頒布することも可能です。
詳しくは、(https://www.oracle.com/technetwork/jp/database/mysql/index.html)を参照ください。
5) MySQLを導入している企業
- 富士通システムズ
- Italtel 社
- 株式会社スクウェア・エニックス
- LINE株式会社
など
3. SQLiteについて
1) 概要
SQLiteは「エスキューライト」、もしくは「エスキューエライト」と読みます。
SQLiteは、パブリックドメインの軽量なRDBMSです。
◆SQLite 開発元のサイト
https://www.sqlite.org/index.html
2) 基本説明
SQLiteの特徴として、著作権が放棄されパブリックドメインで誰もが自由に利用できること、そして、組み込み型RDBMSであることです。
また、前述した「MySQL」や「PostgreSQL」といった一般的なRDBMSは、「クライアントサーバ型」になっています。RDBMSとしての処理はサーバマシンで行い、データベースを利用したい各ソフトウェアはクライアントとして接続するという方式です。この方式ですと、同じデータベースを多数のクライアントで共有できますし、処理を別マシンに分けることで性能の向上も期待できます。
一方、SQLiteはライブラリの形で提供され、ソフトウェアなどに内蔵されます。これを、「組み込み形式」といいます。
そのため、SQLiteのデータベースとしての利用はソフトウェアだけにとどまります。
この方式は、サーバを利用してデータを上手に共用したり、負荷を分散することには向いていませんが、メールの送信者や件名を全部データベースに格納しておく、ブックマークを格納しておくなどして検索を高速化するなど、デスクトップソフトウェア個別での利用に適しているといえます。
①プラットフォーム
基本的にソフトウェアがインストールされているプラットフォーム上なら、どれでも動作します。
主に、Linux、macOS、Microsoft Windows、Android、iOSなど。
特にSQLiteはAndroid端末の標準ライブラリとして採用されています。
②接続可能な言語
C、C++、D、Curl、Java、Perl、PHP、Python、Ruby、Delphiなど。
特にPHP5、Python 2.5、Adobe AIRで標準サポートされています。
3) 市場シェア
DB-Engines.comによるマーケットシェア調査では、2019年9月現在、11位です。
参考:https://db-engines.com/en/ranking
4) 主な特徴、利点
①コンパクト&省メモリ
SQLiteの本体サイズは600KB程度と非常にコンパクトで、消費メモリも少ないため、処理能力が低い小型デバイスでも組み込めます。
②SQLの基本的な機能は搭載されている
搭載されている機能が多すぎるのでここでは全ては載せませんが、主に下記の通りです。
- インデックス、トリガー、ビュー
- 部分インデックス
- CHECK、UNIQUE、NOT NULL、およびFOREIGN KEY制約。
- BEGIN、COMMIT、およびROLLBACKを使用したACIDトランザクション
- 全文検索
- JSONサポート
などです。
詳しくは、(https://sqlite.org/fullsql.html)を参照のこと。
ただし、下記の機能は搭載されていません。
- 右および完全な外部結合(RIGHT OUTER JOINまたはFULL OUTER JOIN)
- ALTER TABLEの完全なサポート
- 完全なトリガーサポート
- ビューへの書き込み
- 付与および取り消し
詳しくは、(https://sqlite.org/omitted.html)を参照のこと。
③処理の高速化
ほとんどのクエリがローカルキャッシュに対して実行され、ネットワークのラウンドトリップを回避できるため、処理時間を短縮できます。
これは、アプリケーション内にSQLiteが組み込まれている性質上、プロトコルやプロセス間通信などのネットワーク通信を行う必要がなく、単なるローカルのファイルやキャッシュに対してアクセスされるためです。
また、例として大量のサムネイル画像に対するアクセスの場合、ファイルシステムでは1ファイルごとにファイルアクセス用システムコールが発生しますが、SQLiteでは1回のシステムコールで複数のファイルにアクセスできます。
④トランザクション機能
SQLiteは、組み込み用途として使用できるデータベースとしては数少ないものとして、トランザクション処理に対応しています。
一度トランザクションを開始するとストレージはロックされ、トランザクション中のセッションはキャッシュを有効利用して動作するため、高速にデータベースにアクセスすることができます。
これは応答性が重要な、かつ多数のトランザクションが並行しないような規模のアプリケーションでは重要な要素となり、SQLiteをサーバーとの中間にキャッシュとして採用する要因や、アプリケーション組み込みデータベースエンジンとしての採用を促す理由にもなっています。
⑤Public domainライセンスの採用
ソースコード形式、またはコンパイル済みバイナリとして、商用、非商用を問わず、あらゆる手段で誰でも元のSQLiteコードを自由にコピー、修正、公開、使用、コンパイル、販売、または配布することができます。
SQLiteのコピーを必要な数だけ作成し、それらのコピーを使用して、制限なしに使用を許可されています。
詳しくは、(https://sqlite.org/copyright.html)を参照ください。
5) SQLiteの導入事例
SQLiteは、さまざまなIoTデバイスのデータベースエンジンとして導入されています。
- スマートフォン(携帯電話)
- 医療機器
- ロボット
- ドローン
- 自動車
- 飛行機
など
4. 結局、どのRDBMSが一番優れているのか?
ここまで「PostgreSQL」、「MySQL」、「SQLite」の特徴を説明してきました。
そこで皆さんが一番知りたいことは、『どのRDBMSが一番優れているのか?』ということだと思います。
そこで、この章では様々なシチュエーションのもと、どのRDBMSを採用すべきなのかを考察していきたいと思います。
1) 「クライアントサーバ型」と「組み込み形式」
まず一番最初に考慮すべきは、これから作成するシステムは「クライアントサーバ型」と「組み込み形式」のうちどちらなのか?ということです。
これら2つは、SQLiteの基本説明で述べた通りです。
ATMなどの複数の端末からデータベースに操作を試みるようなシステムは、「クライアントサーバ型」である「PostgreSQL」、「MySQL」のどちらかを採用すべきです。
逆にそのソフトウェア内で完結するようなデータのやり取りをしたい場合は、「SQLite」を採用します。
ほとんどの場合、データベースと言えば「クライアントサーバ型」ですので、以降は「PostgreSQL」と「MySQL」の2つに焦点を絞っていきます。
2) 機能が多いのはどっち?
2003年ごろまでは、MySQLはサブクエリ、ストアドプロシージャ、ビュー、トリガーなどの機能が搭載されておらず、機能面においてPostgreSQLに遅れをとっていました。
しかし、2005年リリースのver5.0以降から機能面が充実し始め、徐々にPostgreSQLとの差はなくなっていきました。
現在明確にPostgreSQLが機能面で勝っているとのは、前述した「PostGIS」というアドオンソフトが使えることでしょうか。
それに加え、細かい部分ではまだまだPostgreSQLのほうが出来ることが多いです。
(PostgreSQLは、SQL以外にもPythonなどを利用した外部プロシージャが使えますが、MySQLはSQLのみです)
今後もMySQLの機能はバージョンアップにより増えていくと予想されます。
3) 性能で優れているのはどっち?
①SELECTについて
SQLで最も多く使うと思われる『SELECT文』ですが、単純な文ですとPostgreSQLとMySQLには明確な差はありません。
しかし、大量データのソートが必要なSELECT(ORDER BYを使用する場合)はMySQLだと遅くなってしまいます。
理由として、PostgreSQLと比較するとMySQLは、ソートのアルゴリズムがあまり優れていないためです。MySQLは大量データをソートすることを基本的にユースケースとして想定していません。
逆に大量データのうち新規の10件を取得するようなシチュエーションには特化しています。そのような場面では、PostgreSQLよりも速くなります。
②UPDATEについて
UPDATE文が実行されるさい、PostgreSQLはINSERTに近い処理が実行されています。
仕組みとして、変更前の行に削除フラグのようなものを立て、そのうえで変更後のデータを持った新しい行を追加しています。
これは、追記型アーキテクチャのスタンダードな挙動です。
一方でMySQLは、UPDATE対象となる行の値を直接上書きするという、シンプルな挙動をします。
なので、UPDATEに関してはMySQLに軍配が上がると言って良いでしょう。
③DELETEについて
以前はMySQLにはDELETEが遅いという欠点がありましたが、2010年12月リリースのver5.5以降は大分改善されています。
なので、ここでは明確な優劣はつけられません。
④テーブル結合(JOIN)のアルゴリズムについて
テーブル結合をするさい、データ量をはじめ様々なシチュエーションにより、「ネステッドループ結合(Nested Loop Join)」「ハッシュ結合(Hash Join)」「ソートマージ結合(Sort Merge Join)」などがアルゴリズムにより切り替わります。
なので、結合アルゴリズムの種類が多いほどテーブル結合の性能が優れているといえます。
その観点から言うと、「ネステッドループ結合」しかサポートしていないMySQLはあまり優れているとは言えません。
反対に、PostgreSQLは上記3種類すべてをサポートしています。
補足として、なぜMySQLがこのような仕様なのかというと、設計思想に「複雑なアルゴリズムは極力サポートしないよ」というのがあるからです。
4) 堅牢性能で優れているのはどっち?
堅牢性能とは、セキュリティが万全か、エラーが起きないかという観点からの性能評価です。
ここでは、「エラーが起きないか」という観点から両者を比較していきます。
結論から言いますと、堅牢性能はPostgreSQLのほうが優れています。
理由として、MySQLには暗黙的に実施される型変換や、文字列比較の厳格さなどがゆるく、予期せぬエラーが起こりやすいという問題を抱えているからです。
例えば日付型の「2019-09-01」から数字の「1」を引くと、「20190900」という整数が返ります。こんな日付はあり得ないですよね。
このように、普通ならエラーとして判断してほしいところを、スルーしてしまうのがMySQLの弱点といえます。
5) 結論
ここまで比較を行ってきた結果、どちらかというとPostgreSQLのほうが優れているのでは?と思われるかもしれません。
しかし、MySQLには世界2位のシェアという武器があり、また「シンプルな仕様ゆえに高速」という特徴もあります。
そして、両方のRDBMSは毎年アップデートが施され、足りない機能や性能面での弱点が是正されています。
結果として、現時点でこっちが優れているからと言って、数年後もその上下関係が同じとは限りません。
ですので、毎年最新バージョンをチェックし、どのような機能が新たに搭載されたのが、どの弱点が補わられたのかを常に把握しておく必要があるのです。
5. 各RDBMSのインストール方法
ここからは各RDBMSのインストール方法について説明していきます。
動作確認までここでは記載しようと思います。
6. PostgreSQLのインストール手順
1) まずはダウンロード
下記のPostgreSQLの公式サイトから、インストーラーをダウンロードします。
https://www.postgresql.org/
今回は、windows上にインストールします。
現在、ver11.5が最新なので、windows用のインストーラーをダウンロードします。
2) インストール
ダウンロードしたインストーラーを実行します。
インストール先のディレクトリを指定し、Nextボタンで先に進みます。
必要な部品を選択し、Nextボタンを押して先に進みます。
データを保存するディレクトリを指定し、Nextボタンを押下します。
ディレクトリは特にこだわりがなければデフォルトのままで良いでしょう。
初期のsuperuserであるpostgresユーザのパスワード設定をします。
2つの入力欄に同じパスワードを入力してください。
ポート番号を設定します。デフォルトは「5432」なので、問題なければそのままで良いです。
もし使用中なら、他の任意の番号を設定しましょう。
国情報設定です。Japanにしておきましょう。
これでインストールしますよ、という情報が表示されます。
問題なければ、Nextを押します。
Finishでインストーラーを終了します。
チェックボックスにチェックを入れたままですと、追加のアプリケーションのインストーラーが立ち上がるので、今回はチェックなしにしました。
3) 環境変数の追加
コマンド利用のために、PATHを通しておきます。
インストール作業で指定したディレクトリを、環境変数に追加します。
デフォルトのままならキャプチャどおりで良いはずです。
4) インストールされているか確認
コマンドプロンプトを起動させ、下記のコマンドを入力してみましょう。
psql --version
このように、インストールしたバージョンが正しく表示されればOKです。
お疲れ様でした。
7. MySQLのインストール手順
1) まずはダウンロード
下記のMySQLの公式サイトから、インストーラーをダウンロードします。
https://www.mysql.com/
ページ下部にある「MySQL Community (GPL) Downloads »」をクリックします。
「MySQL Community Server」をクリックします。
任意のOSを選択します。ここでは、「Microsoft Windows」にしておきます。
次に「Go to Download Page」ボタンをクリックします。
下の方(ファイルサイズが大きい方)のダウンロードボタンをクリックします。
ログインをするか、アカウントがないなら作成するかを求められますが、赤枠のリンクをクリックすることでダウンロードのみを行うことができます。
2) インストール
ダウンロードしたインストーラーを実行します。
規約を熟読し、同意したのならチェックを入れます。
Nextボタンをクリックします。
今回は「Developer Default」を選択し、Nextを押して進みます。
表示されている2つの機能についてはインストールされませんと説明されています。
構わず、Nextで進みます。
「Yes」で進みます。
インストールされる機能一覧が表示されます。
「Execute」でインストールを開始します。
インストールが完了しました。
Nextで初期設定に入ります。
Nextで進みます。
InnoDB Clusterを利用するかどうかと聞いていますが、今回は使用しないのでStandaloneの方を選択します。
デフォルト設定のまま、Nextで進みます。
Port番号は初期設定では「3306」ですが、他で使用しているのなら変更しましょう。
認証方式を選択します。旧式(ver5.x)か、ver8.xからの安全な暗号化パスワード方式かを選択します。
今回は、せっかくなので新しい方を選択しておきます。
rootアカウントのパスワードを設定します。同じパスワードを2か所に入力してください。
キャプチャ上ではパスワードが脆弱(Weak)だと指摘されていますが、とりあえず気にせず進めます。
チェックを外し、Nextで進みます。
「Execute」で実行します。
正常に完了したので、Finishをクリックします。
Nextで進みます。
なにも入力することがないので、Finishを押します。
Nextで進みます。
先ほど設定したパスワードを入力し、Checkをクリックします。
テスト接続が成功したので、Nextで進みます。
Executeで実行を開始します。
Finishで完了します。
Nextで進みます。
Finishで終了します。
これでインストール作業は完了です。
インストーラーが終了するのと同時にShellが立ち上がります。
これで、正常にインストールされていることが確認できました。
8. SQLiteのインストール手順
1) まずはダウンロード
下記のSQLiteの公式サイトから、インストーラーをダウンロードします。
https://www.sqlite.org/index.html
Downloadリンクをクリックします。
今回はWindows環境で動作させますので、Precompiled Binaries for Windowsから選択します。
赤枠で囲ったリンクをクリックします。
ダウンロードした圧縮ファイルを解凍すると、3つのファイルが展開されます。
2) 動作確認
コマンドプロンプトからデータベースを作成してみます。
C:\SQLiteというディレクトリを作成し、そのなかにsqlite3.exe ファイルを置きます。
コマンドプロンプトを起動させ、下記のコマンドを入力してみましょう。
sqlite3 test.sqlite3
これは、sqlite3コマンドで新しく「test.sqlite3」というデータベースを作成するという意味です。
正常にデータベースが作成されました。
これで、SQLiteが正常に動作していることが確認できました。
9. おわりに
以上で、主要なRDBMSの説明を終わります。
前述しましたが、これらのデータベースは日々進歩しています。
システム開発においてどのデータべースが適しているのか、最新の情報を入手し、皆さんの知識自体もアップデートしていくことが必要不可欠です。
このページは、そんな皆さんの手助けになってもらえたら幸いだと思います。
piponではエンジニアの皆様に業務委託や副業でAI・データサイエンスの案件をご紹介しています!
piponの案件にご興味がある方は以下のフォームにご登録ください。案件をご案内します。