2011-12-29 96 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