SQLiteが「大量の小さなクエリ」の処理を得意とする理由とは?
MySQLやPostgreSQLといったクライアント・サーバー型のデータベースで大量のクエリを発行すると、クライアントとサーバー間の通信が大きなボトルネックとなることがあります。一方、軽量データベースのSQLiteは、その設計上「大量の小さなクエリ」の処理が得意であるとのこと。なぜSQLiteが効率的に大量のクエリを処理できるのかについて、SQLiteが説明しています。
Many Small Queries Are Efficient In SQLite
https://sqlite.org/np1queryprob.html
SQLiteの利用方法を記したページによると、SQLiteでは1つのウェブページにつき200クエリが適切であるとのこと。この記述について、開発者からしばしば「1つのページにつき200クエリなんて、ばかげている」と指摘されることがあるそうです。
SQLiteは開発者からの指摘に対し、「『1つのページにつき200クエリ』が問題になるのは、MySQLやPostgreSQLといった、アプリケーションとデータベースが別々に動作するクライアント・サーバー型のデータベースである」と主張。クライアント・サーバー型のデータベースでは、アプリケーションとデータベース間の通信が「N+1問題」と呼ばれる「大量のクエリを実行すると、非常に時間がかかる」問題を引き起こします。一般的には、N+1問題を回避するためにJOIN句を使ってテーブルを結合したり、Eager loadingを用いてデータを事前に読み込んだりするといった方法が取られます。
N+1問題を抱えるクライアント・サーバー型のデータベースとは異なり、SQLiteはアプリケーションがファイルを直接読み書きする構造であるため、大量のクエリを実行しても通信によるボトルネックが発生しないとのこと。データベースにSQLiteを採用しているバージョン管理システム「Fossil」では、N+1のクエリを多用することでコードベースの簡素化に成功しているそうです。また、海外ニュースサイト・Hacker Newsでは、「SQLiteの性質は、N+1問題を抱えるGraphQLと非常に相性がいい」という指摘もなされています。
なお、SQLiteはレプリケーションができない点がデメリットとされていますが、Amazon S3を用いたSQLiteのレプリケーションを実現するプロジェクトも存在します。
「複雑すぎるサーバー構成」を原点にまで簡素化する「Litestream」が生まれた理由 - GIGAZINE
・関連記事
データベースの中身がほぼ削除されてネコの鳴き声だけが書き残される謎の「ニャー攻撃」が活発化 - GIGAZINE
PostgreSQLには「中途半端なサイズ」のデータを格納しないほうがいい - GIGAZINE
FacebookがオープンソースのSQL対応分散クエリエンジンPrestoを発表、ペタバイト規模のデータ処理も可能 - GIGAZINE
ダンジョンを攻略しつつSQLインジェクションの脆弱性について学べるサイト「Lord of SQLInjection」 - GIGAZINE
GitHubっぽくデータベースのバージョン管理やホスティングができる「DoltHub」 - GIGAZINE
・関連コンテンツ