0

我在一个表中有一堆 BLOB 类型的列。这些列中包含的数据使用 MySQL 的 AES_ENCRYPT() 函数进行加密。其中一些字段正在我正在构建的应用程序的搜索部分中使用。在经常访问的列上放置索引是否值得?我不确定它们是 BLOB 的事实或数据本身已加密的事实是否会使索引无用。

编辑:这里有一些关于我的具体案例的更多细节。有一个大约 10 列左右的表,每个 BLOB。插入此表的每条记录都将使用 AES_ENCRYPT() 函数进行加密。在我的应用程序的搜索部分,用户将能够输入他们的查询。我接受他们的查询并像这样解密它,SELECT AES_DECRYPT(fname MYSTATICKEY) AS fname FROM some_table以便我可以使用 LIKE 子句执行搜索。我很好奇的是索引是否会索引加密数据而不是解密返回的实际数据。我猜如果索引仅应用于加密的二进制字符串,那么它根本不会帮助性能。我错了吗?

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 回答