我原本將我的字段設置爲latin1_swedish_ci
,我將其更改爲utf8_general_ci
(字段和表),然後發現我的查詢從〜1.8秒變爲〜3.3。我有一個字段的索引,甚至重新創建索引(刪除然後添加)。該字段按子句順序使用。爲什麼當我將字段更改爲utf8時,我的查詢需要兩倍的時間?
任何想法,如果可能有問題或這是正常的?
我正在運行MySQL 5.0。
我原本將我的字段設置爲latin1_swedish_ci
,我將其更改爲utf8_general_ci
(字段和表),然後發現我的查詢從〜1.8秒變爲〜3.3。我有一個字段的索引,甚至重新創建索引(刪除然後添加)。該字段按子句順序使用。爲什麼當我將字段更改爲utf8時,我的查詢需要兩倍的時間?
任何想法,如果可能有問題或這是正常的?
我正在運行MySQL 5.0。
latin1_swedish_ci
是一個一個八位字節的字符編碼系統。一旦你知道比較字符和整個字符串的排序(或排序)順序是相對平凡的。
utf8_general_ci
每個字符需要1到4個八位字節。在這種編碼中解碼八位位組數據更困難,所以需要更長的時間。
我自己並不經常使用mysql,但我可能會對問題的出處提供一些見解。
latin1_swedish_ci字符集是一個八位字節編碼系統,這意味着用這個系統編碼的每個字符都只佔用一個字節。將其與utf8_general_ci字符集進行對比,其中每個字符由每個字符1到4個八位字節組成,這意味着需要1到4個字節來表示每個字符。
這有一個明顯的缺點,即utf8字符佔用更多的空間,更多的內存,最重要的是,更多的cpu時間來識別。最明顯的優勢是utf8字符可以編碼任何unicode字符。
由於此問題標有'查詢優化',所以您需要問自己,您是否真的需要表示更多'異國情調'的字符,或者如果是單字節系統中表示的字符(例如純ASCII - 表)足夠滿足您的需求。由於其性質,utf8會吃更多的CPU /內存。
你的查詢是怎樣的?
是否可以在該字段上使用過濾器,並且指定參數的數據類型爲非utf8數據類型?在這種情況下,數據庫管理系統將不得不進行一些鑄造,這會妨礙性能。
該字段純粹用於by和where子句中的其他tinyint(1)字段。 – 2009-01-21 18:31:00