我试图找出应该用于仅包含两列user
和email
的简单password
表的排序规则,由此password
的输入将是password_hash($str, PASSWORD_DEFAULT)
的输出。
password_hash所需的最轻量级归类是什么?是ascii_bin
吗? latin1_bin
?
答案 0 :(得分:3)
整理性能...
..._bin
要做的事最少,因此是最快的。
ascii_...
检查您是否仅使用7位;这么快。
..._general_ci
仅检查字节,不检查字节组合。例如:德语ß
<>'ss',与大多数其他归类不同。
utf8_...
和utf8mb4_...
检查字节以获取有效的编码。
与此同时,MySQL 8.0使utf8mb4_...
排序规则比5.7“数量级更快”。
但是我通常发现其他注意事项在MySQL的任何操作中都更为重要。
该示例的另一示例... SELECT ... function(foo) ...
-相对于获取行的成本,评估函数的成本通常并不重要。因此,我专注于如何优化提取行。
对于散列,...取决于函数是否返回十六进制字符串或一堆字节...
CHARACTER SET ascii COLLATION ascii_bin (or ascii_ci)
...ci
可以进行大小写折叠,因此更宽容;这可能是案件的“正确”整理方式。BINARY
;大致相当于CHAR CHARACTER SET binary
。关于是否使用BINARY
和VARBINARY
还是CHAR
和VARCHAR
,应该由函数是否返回固定长度的结果来控制。例如:
MD5('asdfb') --> '23c42e11237c24b5b4e01513916dab4a'
恰好返回32个十六进制字节,因此CHAR(32) COLLATION ascii_ci
是'best'。
但是,您可以使用BINARY(16)
(不使用排序规则)来节省空间,并将UNHEX(MD5('asdfb'))
放入其中。
UUID() --> '161b6a10-e17f-11e8-bcc6-80fa5b3669ce'
,其中一些破折号可以消除。否则为CHAR(36)
或BINARY(16)
。