2011-12-29 29 views
1

我使用的用户名binary string comparison(定义为varchar),以确保该字符串完全匹配:在mysql中使用二进制文本比较 - 效率陷阱?

... where binary Owner = '$user' ... 

... from Records join Users on binary Records.Owner = Users.User .... 

但我不知道是否有一些(或正面或负面)对效率的影响。 The manual状态:

注意,在某些情况下,如果你施放一个索引列到BINARY, MySQL是不能够有效地使用索引。

这是一个问题吗?我希望二进制更快,相反,因为它不必忽略大小写,空格,一些重音符等。

+1

你检查你的查询的MySQL执行计划吗? – rene 2011-12-29 11:43:53

回答

1

事实上,WHERE子句中的表达式可能无法使用索引在一列上。你不会期望在名为x浮点型列的索引以任何方式使用,例如搜索

WHERE SIN(x) BETWEEN 0.0 and 0.1 

您问题的答案是将您的所有者列定义为具有二进制排序而不区分大小写的排序规则。看到这里如何做到这一点:http://dev.mysql.com/doc/refman/5.0/en/charset-column.html

+0

感谢Ollie。使用二进制排序规则和使用[BINARY或VARBINARY数据类型](http://dev.mysql.com/doc/refman/5.6/en/binary-varbinary.html)有什么区别?谢谢,托马斯 – TMS 2012-01-13 21:08:36

+0

@Tomas,交易是这样的:一个列的索引被组织来使用列的排序规则进行搜索。因此,如果您需要区分大小写的搜索,请使用区分大小写的排序规则。与其他操作符一样,'binary'操作符在搜索中列的内容上,使得mySQL可能不得不扫描表而不是使用索引。你应该在查询上运行'EXPLAIN'来确定。 – 2012-01-13 22:31:16

+0

Ollie,这是一个误解:在我最后的评论中我问:使用二进制排序规则(我的意思是通过在您的答案中定义列,而不是使用二元运算符)并使用BINARY/VARBINARY数据类型?谢谢 – TMS 2012-01-13 22:40:12