Appleの07年度第3四半期決算が発表されました。地域別のMacの出荷台数を見ると、欧米のほうが日本より伸び率が高いんですね。話はガラッと変わりますが、ウチの3歳の娘が、幼稚園で覚えてきたのか事あるごとに「欧米か!」を連発して困ります……。

さて、今回は「SQLite」について。Tiger/Spotlightの登場以降、急速に増えつつあるSQLite内蔵アプリケーションの一端を知ろう、という主旨だ。

SQLiteを使うというトレンド

SQLiteは、スタンドアロンのデータベース管理ソフト(DBMS)。名前が示すとおり、PostgreSQLやMySQLなどと同じSQL構文を使うDBMSだが、サーバとしてシステムに常駐することはなく、ライブラリとして他のアプリケーションから呼び出される形での利用が一般的。大規模なDBの管理こそ不向きだが、SQLの命令やトランザクション処理を実行できる。メモリ消費量も少なく動作は高速、ユーザ登録などの管理作業も必要なし、ファイル入出力的感覚で利用できることが特徴だ。

そのSQLiteは、Tigerで導入されたデータハンドリング用フレームワーク「CoreData」、そして御存知ファイル検索ツール「Spotlight」でも活用されている。大げさな言い方をすれば、SQLiteなくしてSpotlightなし、SpotlightのないTigerなど牙の抜かれた……ということになる。

SQLiteが著作権が放棄されたパブリックドメインのソフトウェアであることも、大きなポイントだ。OS Xのような商用ソフトはもちろん、フリー/シェアウェアでもその機能を利用できる。アプリケーションの検索用途にSQLiteを組み込むことは、もはや1つのトレンドだと言ってもいいだろう。

現在OS Xで動作するアプリケーションの中にも、直接/間接的にSQLiteの機能に依存するものは少なくない。メールクライアントのApple Mail、WebブラウザのSafari 3やFirefox 3(いずれもα段階)、そして前述のSpotlight。それでは、SQLiteをキーワードに、これらアプリケーションのTIPS的な使い方を紹介してみよう。

アプリケーションとの会話

OS X/Tigerには、SQLiteのフロントエンドとして「sqlite3」コマンドが収録されている。手始めに、このsqlite3コマンドを使いApple Mailと"会話"してみよう。

Apple Mailは、~/Library/Mail/Envelope Indexをデータベースとして使用する。万が一に備え、まずは次に示す手順でデータベースをバックアップしておこう。以下のコマンド実行例は、バックアップファイルを対象に作業するので念のため。


$ cd Library/Mail
$ cp "Envelope Index" "Envelope Index.bak"

データベースを引数としてsqlite3コマンドを実行すると、バージョン名を表示したあとにプロンプト(sqlite>)が現れる。どのような内部コマンドがあるか、画面の指示どおり「.help」とタイプしてみよう。先頭が「.」で始まるなど、内部コマンドの約束事がわかるはずだ。


$ sqlite3 "Envelope Index.bak" 
SQLite version 3.1.3
Enter ".help" for instructions
sqlite> 

Apple Mailのデータベースだが、以下のとおり「.table」コマンドを実行すると、データベース内に存在するテーブルが一覧される。受信したメールの送信主(addresses)、添付ファイル(attachments)など、名称を見ればおよそどのような情報が蓄積されているか検討がつくはず。


sqlite> .table
addresses        messages         sqlite_sequence
attachments      properties       subjects       
mailboxes        recipients       threads

SQLの命令も実行できる。たとえば、以下のとおりselect命令を実行すると、subjectsテーブルに蓄えられたメッセージの表題部分がズラズラ表示されるはず。SQLの心得があるのならば、いろいろ試してほしい。なお、「.quit」コマンドを実行するかcontrol-Dを押せば、sqlite3のプロンプトは終了する。


sqlite> select * from subjects;

インデックスを最適化すると速くなる!

データベースは追加 / 削除を繰り返すうちに、一種のフラグメンテーションを引き起こす。データが非効率に格納されているため、ファイルサイズがかさみ、データの検索速度も低下する。

そこで紹介するのが、以下のコマンド実行例。Apple Mailのデータベースに対し、不要領域を取り除くSQLのvacuum命令を実行することで、フラグメンテーションを解消するわけだ。Apple Mailの裏ワザとして有名だが、前述したようなSQLとの関係を知ると見方も変わるはず。なお、事故防止のためあらかじめバックアップを作成し、Apple Mailを終了した状態で実行してほしい。


$ sqlite3 ~/Library/Mail/Envelope\ Index vacuum

Safari 3のページ内検索機能にも、SQLiteが利用されている。体感できるほどの効果があるかは不明だが、Apple Mailと同様の方法でデータベースを効率化できる。こちらもバックアップを作成のうえ、自己責任で試してほしい。


$ ls ~/Library/Syndication/
Database3   ←次のコマンドラインで使うデータベース名
$ sqlite3 ~/Library/Syndication/Database3 vacuum