99円でWordPress!

このサイトはWordPress(SQLite)+ロリポエコノミープランで動いています

SQLiteの仕様上の制限は特に気にしなくても大丈夫な話。

SQLiteはその名称=Liteの意味「軽い」「低い」「少ない」といった言葉からして、MySQLのようなデータベースよりも下位なものといった印象を持つかもしれません。実際のところ、確かにそうした面が全く無いとは言えませんが、WordPressを運用するにあたっては、ほとんど気にしなくても良さそうです

今回はそれについて私見を書いてみます。

SQLiteの仕様上の制限

SQLiteの公式サイトには「SQLiteの制限」と題されたページがあります。そこでは

  • 文字列または BLOB の最大長
  • 最大列数
  • SQL ステートメントの最大長
  • 結合内のテーブルの最大数
  • 式ツリーの最大深さ
  • 関数の引数の最大数
  • 複合 SELECT ステートメント内の用語の最大数
  • LIKE または GLOB パターンの最大長
  • 単一の SQL ステートメント内のホスト パラメータの最大数
  • トリガー再帰の最大深さ
  • 接続されたデータベースの最大数
  • データベース ファイル内の最大ページ数
  • テーブル内の最大行数
  • データベースの最大サイズ
  • スキーマ内のテーブルの最大数

全部で15の制限について記載があります。各制限が意味する細かい部分までは、技術者ではない自分では理解が及ばなかったのですが、WordPressの運用においてはどれも余裕のある数字と捉えて差し支え無さそうでした。

億単位の文字も書ける

例えば一番最初の「文字列または BLOB の最大長」は、WordPressの本文(投稿テキスト)でどれくらいの文章量まで書いても問題無いか、といったことですが、

BLOB の最大バイト数は、プリプロセッサ マクロ SQLITE_MAX_LENGTH によって定義されます。このマクロのデフォルト値は 10 億 (10 億または 1,000,000,000)

という膨大な数字となっています。10 億バイトは1GBなので、1投稿に1GBものテキストを書くことまでできます。これは文字数に換算しても億単位の文字が1投稿に書けることになります。もっとも、レンタルサーバーの仕組み的にそうした部分では制限がかけられている可能性もありますが、通常は制限を気にしなくて良い数字と言えます。

また、BLOB (Binary Large OBject)もSQLiteには格納可能なようですが、WordPressにおいてはDB自体に画像や動画等を入れるといった運用は無いでしょうから、これも気にしなくて問題無いと思います。

データベースの最大サイズの項目によれば、データベースは最大281TBまでとなっています。これももちろん、WordPressにおいては余裕あり過ぎる数字と言え、データベース自体でそこに至ることは不可能でしょう。

ちなみに、ファイルフォーマットの項目では

一般的に使用される SQLite データベースのサイズは、数キロバイトから数ギガバイトの範囲である傾向がありますが、運用環境ではテラバイト サイズの SQLite データベースが存在する。

https://sqlite.org/fileformat.html

とのことで、大規模な運用にも耐え得るようです。「Lite」を含む名称からは想像もつかない、ヘビーな使われ方もしているそうです。

実際の運用における速度

私は当サイト「99円でWordPress!」を始める以前から、個人的なメモ書き用途としてもSQLite版のWordPressを利用していました。Google KeepやEvernoteの代替のような形で、年単位で利用していたので、エントリー数は1万件近くあり、また .sqlite ファイル自体も45MB程度ありました。これは画像や動画等は無い、テキストのみで45MBなので、日本語の場合なら2000万文字くらいのテキスト量に相当します(テンプレート等投稿以外のテキストも含む)。

そうした大量のエントリー数のあるSQLite版WordPressを利用してみたところ、現在のこのサイトの20記事程度と比較しても、特に速度が落ちるといったことはありませんでした。文字列の検索も、1秒以内に結果が出ます。全くといって良いほど速度に違いはありませんでした。

ですので、SQLiteだから容量が足りなくなるのでは?といった心配は一切しなくても大丈夫ですし、たくさん書いたからと言って遅くなるといった心配も不要と考えています。

SQLiteで不向きなケース

基本的には、SQLiteの仕様上の制限によってWordPressで困ることは全く無いと思います。しかしながら、よく言われている通り、SQLiteは同時書き込みには弱いです。厳密に言えば、弱いというより、そもそも同時書き込みが仕様上できないようです。データの書き込み時にデータベース全体がロックされるため、同時に書き込みが多い場合は、そのロックが解除されるのを待たなければならないため、速度が低下したり、エラーを返したりします。これは仕様上、MySQLにはどうしてもかなわない部分なのかと思います。

ただ、通常データベースがロックされる時間は数ミリ秒とされており、ほとんどの用途で問題は出ないと考えられます。ちなみに、SQLite公式サイト自体もSQLiteを使用していて、1 日あたり約 500,000 の HTTP リクエスト (1 秒あたり約 5 ~ 6 件) に応答し処理できているそうです。SQLite公式サイトはWordPressで動いているわけでは無いので単純な比較は出来ませんが、少なくともSQLiteの仕様上の制限があっても、それくらいの処理ができ得ることを示しています。

HTTPリクエスト数と、サイトのPV数では単位が全く違うので、こちらも単純な比較はできませんが、万単位のPV数があるサイトでもSQLite版WordPressで対応は可能と思われます。

そうしたサイトの規模を超え、多数のユーザーがアクセスする人気サイトとなり、且つデータベースへの書き込みが同時に殺到するようなシーン、例えばコメント欄に多数の人が同時に書くような場合には、SQLiteは向いていないので、最初からMySQLを検討した方が良いでしょうが、まずは安価にWordPressをやりたい場合はSQLiteで十分カバーできるはずです。

いかがでしたでしょうか?何かの参考になれば幸いです。


投稿日

カテゴリー:

投稿者:

タグ: