我在MySQL中有一个AES加密列,我想对其进行排序并对结果进行分页。
我将遍历每一行并将其添加到数组中。然后我对数组进行排序。使用>这变得非常慢10K行。
我正在考虑添加一个额外的列并添加0 - #####中的顺序,但我看到的问题是每次在中间插入一行时都必须更新排序。< / p>
如果有人有这方面的经验,我只是想集思广益。
谢谢
答案 0 :(得分:3)
-- drop table encryptIt;
create table encryptIt
( id int auto_increment primary key,
ciphertext blob not null
);
按原样从PHP加密,或查看This answer。
现在是时候直接从mysql中分页出来而不需要PHP循环和排序。假设您将秘密your_key
提供给mysql。假设你可以得到一个基本的计数,因此知道你的页数(每页25)。
SELECT id,CAST(AES_DECRYPT(ciphertext,'your_key') AS CHAR) AS cleartext
FROM encryptIt
order by cleartext
limit 0,25; -- start at first block of 25, bring back 25
-- limit 2,25; -- start at 3rd block of 25, bring back 25
正常分页使用order by和limit。
遵循最佳做法的密钥管理。一个模糊的评论,但我把它扔出去。
答案 1 :(得分:-1)
据推测,您的加密行没有任何自然排序顺序。 (这是加密它们的一部分。)
您可以在其上放置一个自动增量ID列,并使用它进行排序/分页。您还可以在其上添加插入时间戳。
但是,如果您想要的只是一个稳定的排序顺序,那么每次检索它们时它们都以相同的顺序出现,您可以简单地按加密值进行排序。如果它们存储在TEXT或二进制大对象(BLOB)列中,您可以按该列的内容进行排序。
有一个名为max_sort_length
的设置,用于控制大对象列中ORDER BY考虑的字节数。通过比较前几十个字节,可以可靠地对包含加密数据的列进行排序。为此,在使用ORDER BY进行查询之前先发出此命令。
SET max_sort_length 48
阅读本文以获取更多信息。 https://dev.mysql.com/doc/refman/5.7/en/blob.html