2011-11-11 28 views
6

我正在使用django應用程序執行一些'startswith'ORM操作,將longtext列與unicode字符串進行比較。這會導致LIKE BINARYu'mystring' unicode字符串的比較操作。 LIKE BINARY可能比簡單的LIKE更慢嗎?SQL'LIKE BINARY'比普通'LIKE'慢嗎?

我知道一般的答案是基準測試,但我希望對數據庫有一般的想法,而不僅僅是我的應用程序,因爲我以前從未見過LIKE BINARY查詢。

我碰巧在使用MySQL,但我對SQL數據庫的答案感興趣。

回答

5

如果性能似乎成爲問題,那麼可能是是創建第一個副本的好主意,例如。長文本的255個字符,添加一個索引,並使用startswith。 「

順便說一句,this page says:」如果您需要做區分大小寫的匹配,請將您的列聲明爲BINARY;請勿在您的查詢中使用LIKE BINARY來轉換非二進制列。使用該列上的任何索引。「這是一個古老的提示,但我認爲這仍然有效。

+1

證實這個行爲在mysql 5.5.31中。對於django來說,這意味着使用__istartswith而不是__starts來獲得良好的性能很重要。 – Julian

2

對於誰碰到這個運行旁邊的人 - 我們的相對小型的數據庫查詢:

SELECT * FROM table_name WHERE field LIKE 'some-field-search-value'; 

... Result row 

Returns 1 row in set (0.00 sec) 

相比:

SELECT * FROM table_name WHERE field LIKE BINARY 'some-field-search-value'; 

... Result row 

Returns 1 row in set (0.32 sec) 

長話短說,至少在我們的數據庫(MySQL的5.5/InnoDB),兩次查找之間的性能有非常顯着的差異。

但顯然,這是在MySQL 5.5中的錯誤:http://bugs.mysql.com/bug.php?id=63563,在我反對在MySQL 5.1相同的數據庫測試LIKE BINARY查詢仍然使用該索引(而在5.5它執行全表掃描。)