0

テーブルに BLOB 型の列がたくさんあります。これらの列に含まれるデータは、MySQL の AES_ENCRYPT() 関数で暗号化されます。これらのフィールドのいくつかは、私が構築しているアプリケーションの検索セクションで使用されています。頻繁にアクセスされる列にインデックスを付ける価値はありますか? それらが BLOB であるという事実や、データ自体が暗号化されているという事実によって、インデックスが役に立たなくなるかどうかはわかりませんでした。

編集:ここに私の特定のケースに関する詳細があります。各BLOBである〜10列程度のテーブルがあります。このテーブルに挿入される各レコードは、AES_ENCRYPT() 関数を使用して暗号化されます。アプリケーションの検索部分で、ユーザーはクエリを入力できます。SELECT AES_DECRYPT(fname MYSTATICKEY) AS fname FROM some_tableLIKE 句を使用して検索を実行できるように、クエリを取得してこのように復号化します。私が興味を持っているのは、インデックスが復号化から返される実際のデータではなく、暗号化されたデータをインデックス化するかどうかです。インデックスが暗号化されたバイナリ文字列のみに適用された場合、パフォーマンスはまったく向上しないと推測しています。私はそれについて間違っていますか?

4

1 に答える 1

2

次の点に注意してください。

  • FULLTEXTタイプのインデックスをBLOB列に追加することはできません( http://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html
  • したがって、別のタイプのインデックスを使用する必要があります。BLOBの場合、プレフィックスの長さを指定する必要があります(http://dev.mysql.com/doc/refman/5.0/en/create-index.html)-長さはストレージエンジンによって異なります(例:最大1000) MyISAMテーブルの場合は長さバイト、InnoDBテーブルの場合は767バイト)。したがって、保存している値が短い場合を除いて、すべてのデータにインデックスを付けることはできません。
  • AES_ENCRYPT()は文字列を暗号化し、バイナリ文字列を返します。このバイナリ文字列は、インデックス付けされる値になります。

したがって、IMO、あなたの推測は正しいです-インデックスは検索のパフォーマンスに役立ちません。

「暗号化された列のインデックス作成」はかなり一般的な問題であることに注意してください。オンラインでの記事はほとんどありません。たとえば(これはかなり古く、MS SQLの場合はいくつかのアイデアをカバーしていますが): http: //blogs.msdn.com/b/raulga/archive/2006/03/11/549754.aspx

参照:暗号化された顧客データを保存し、それでもインデックスを作成するための最良の方法は何ですか?(トップアンサーは私が上で見つけた同じ記事にリンクしています)

于 2013-02-16T10:22:01.333 に答える