MySQL逐字节比较,哪个更快?二进制与 bin_collat​​e

Posted

技术标签:

【中文标题】MySQL逐字节比较,哪个更快?二进制与 bin_collat​​e【英文标题】:MySQL byte-for-byte comparison, which is faster? binary vs bin_collate 【发布时间】:2014-12-14 20:03:37 【问题描述】:

假设我们有一个如下所示的表:

create table t1(c1 varchar(x)collate utf8mb4_general_ci, index(c1))

要进行字节敏感的比较,我们基本上有两种方法(假设所有相关字符串有尾随空格,即它们都是padspace-compliant):

select*from t1 where c1 ='test'collate utf8mb4_bin

select*from t1 where c1 = binary'test'

当关注性能时应该首选哪个?

当使用非二进制字符排序的索引时,compare 和 binary string 或二进制排序是否更快?

(向表中添加一个新列只是为了存储c1 的二进制等价物对存储的影响很大,而且不可能。)

(P.S. 希望有一个比较哈希和 btree 比较的答案,尽管我主要对 btree 比较感兴趣。)

【问题讨论】:

在你目前的测试中,你发现了什么? 添加索引到 c1 可能是一种改进,如果性能受到关注;另外,c1 可以有什么样的可能值?它们可以放入枚举吗?也许您必须添加一个带有 c1 预处理变体的列? 这些数字很古怪,而且足够接近,可以通过单边测试得出任何结论。 @Ashalynd,索引已经是 utf8mb4_general_ci。存储的值是“英文单词”,尽管用户可以在其中输入随机字符,甚至是中文字符。 您是否对两个查询都运行了解释?我想知道该索引是否甚至被用于第二个变体。 @Ashalynd,在不必要的时候维护额外的索引是很昂贵的。尤其是在 mysql 中,当我们必须专门为它创建一个新列时,不仅索引存储翻倍,数据存储也翻倍;见***.com/q/6199440/632951 和dev.mysql.com/worklog/task/?id=826。此外,这是一个“二元转换”与“整理转换”的问题。 【参考方案1】:

由于您在表中有索引,对于二进制匹配,使用二进制作为常量,而不是列。这将比您的两个选项都快。

select * from t1 where c1 = binary 'test'

回答你的问题是选项 1 在你正在做的地方会更快

WHERE c1 collate utf8mb4_bin='test'

【讨论】:

感谢您的提示,我已更新问题以将铸件放在右侧(而不是左侧)。因此,对于这两种情况,右侧的转换是更快地转换为二进制字符串还是转换为二进制排序规则更快? OK..Great.. 在这种情况下,排序会更快。但我更喜欢二进制,因为它会排除像'test'(带有尾随空格)这样的值,而排序规则将包括它。但是,如果您的要求也包括“测试”,那么请继续进行排序 字符的二进制转换比 varchar 值的整理二进制占用更多空间。此链接可能会有所帮助。 link 是的,假设输入与padspace 行为一致(换句话说,假设输入没有尾随空格)。顺便说一句,当您说“整理会更快”时,您是否有任何测试或链接/文档支持该声明? 查看我之前的评论会有一个链接说 Binary 比 Collat​​ion _Bin @Pacerier 占用更多空间

以上是关于MySQL逐字节比较,哪个更快?二进制与 bin_collat​​e的主要内容,如果未能解决你的问题,请参考以下文章

以字节数组和二进制 (BLOB) 存储图像之间的区别以及哪个更快

C++ Exp 与 Log:哪个更快?

matlab的bin文件高低字节转换

逐字节读取二进制 istream

Python - 如何逐字节编辑十六进制文件

解析十六进制文件并逐字节解码