2013-07-05 66 views
1

我有一個表稱爲users與列firstname與整理utf8_binMYSQL COLLATE性能

我想知道的引擎蓋下會發生什麼,當我執行像

SELECT * FROM `users` `a` WHERE `a`.`firstname` = 'sander' COLLATE utf8_general_ci 

firstname ISN的查詢索引,命令執行時會發生什麼?

而如果默認排序規則爲utf8_general_ci,並且由於沒有COLLATE

我想知道它有一個大表的影響(800萬個+記錄)

+1

這可能更適合於http://dba.stackexchange.com –

回答

3

在這種情況下執行查詢,強制排序規則在與列編碼相同的字符集上定義,不會有任何性能影響。但是,如果強制對不同字符集定義的排序規則,MySQL可能需要對列的值進行代碼轉換(其中會產生性能影響)。我認爲,如果強制排序規則在Unicode字符集MySQL將自動做到這一點,任何其他情況會引發錯誤「的歸類非法組合」。

注意,記錄對一個列定義的排序規則僅僅是一個提示到MySQL在其歸類是優選的;它可以是或可以不是在一個給定的表達式中使用,這取決於Collation of Expressions下詳述的規則。

+0

有意義,所以如果編碼保持不變,MySQL只是使用一點點不同的算法來搜索/排序列(其中case-insentive比較速度較慢,因爲它不是二進制比較)。 –

+0

@VisserSander:這是正確的。整理不會影響數據存儲 - 它僅用於執行比較。需要注意的是'utf8_bin'是*不*二進制比較(如同絲線爲用'BINARY'關鍵字二進制字符串處理將進行),而是一個碼點比較。因此,如果相同的代碼點可以以多種方式進行編碼(在'utf8'不可能的,但有可能在因爲替代物的'utf16'),不同的字符串可導致比較等價。 – eggyal