PHPのSQLite3で”キー”が文字列の場合とバイナリの場合の速度の違い

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

SQLite3では主キー(PRIMARY KEY)がINTEGER型が一番早い

SQLiteの公式によると、テーブルの主キーが”INTEGER PRIMARY KEY”型で宣言された場合、他の型より最低2倍近く早いそうです。

ROWIDs and the INTEGER PRIMARY KEY

Searching for a record with a specific rowid, or for all records with rowids within a specified range is around twice as fast as a similar search made by specifying any other PRIMARY KEY or indexed value.
(意訳:特定の”rowid”を持つレコードを検索するか、指定された範囲内の”rowid”を持つすべてのレコードに対して検索を行うと、他の”PRIMARY KEY”または”INDEX”の値を指定して同様の検索を行った場合と比較して約2倍の速度が得られます。)

With one exception noted below, if a rowid table has a primary key that consists of a single column and the declared type of that column is “INTEGER” in any mixture of upper and lower case, then the column becomes an alias for the rowid. Such a column is usually referred to as an “integer primary key”.
(意訳:1つの例外がありますが、rowidのテーブルが1つの列で構成され、主キーの宣言された型が(大文字と小文字関係なく)「INTEGER」の場合、列はrowidの別名になります。このような列は、通常、「INTEGER PRIMARY KEY」と呼ばれます。)

つまり、「rowid」(テーブルを作成したのち各行に割り当てられるユーニークな64ビットのID)を使った検索が一番速いのですが、テーブル作成時の列を「INTEGER」型で宣言(INTではない事に注意)すると、その列は「rawid」と同等として扱われるため速いそうです。

このINTEGER型で宣言した場合の挙動は元々はバグだったそうですが、結果オーライなのと従来との仕様のバッティング(衝突)のため、変更は保留となっているそうです。

参考文献

関連記事

PHPのSQLite3で”database is locked”エラーが頻繁にでる... PHPのSQLite3で同時アクセスが多いとDBがロックされワーニングが出る Warning: SQLite3::exec() : database is locked in /home/users/hogehoge.php on line xxx 自前のDB管理用のクラスを作ってS...

スポンサーリンク
レクタングル(大)広告

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク
レクタングル(大)広告