2011-01-29 301 views
3

我有一個查詢是這樣的:在latin1中查詢速度很快,utf8速度慢 - 爲什麼?

SELECT DISTINCT table1.id, {long list of fields} FROM table1 
    INNER JOIN table2 ON table1.table2_id = table2.id 
    {... more joins ...} 
    LEFT JOIN table_last ON table_last.id=some_table.last_id 
    WHERE (table_last.id IS NULL) AND {...more conditions...} 
    ORDER BY table1.date_entered desc LIMIT 0,6 

在同一個數據庫這個查詢運行時的latin1作爲客戶端字符集運行良好(< 1S運行時),而且是極其緩慢(不能等待它完成後)SET NAMES 'utf8'。查詢返回70行(當然是限制之前的部分),所以結果集大小不應該成爲問題。我檢查了所有連接中的所有表,並且它們都使用UTF-8作爲它們的字符集(我使用SHOW TABLE CREATE進行了檢查)。

什麼會導致這種奇怪的行爲?在這種情況下,utf8如此糟糕以至於latin1? 如果相關,則ID字段爲char(36),並且聯接具有基於這些字段,整數字段和varchar字段的條件。

P.S.我知道DISTINCT可能需要時間,但我無法刪除它,無論如何它是70行,它快速默認(latin1)設置!所以它看起來像查詢外部的東西,但是什麼?

+3

你的表格是什麼排序規則? – 2011-01-29 02:15:34

+0

@Pekka:utf8_general_ci我認爲 – StasM 2011-01-29 02:18:37

回答

0

當表我們使用utf8它分配一個3倍的varchar 的長度每行(256 * 3 = 768個字節)!

這將意味着您的查詢使用了更多的資源,現在這些字符串佔用了三倍的空間 - 所以緩衝區沒有那麼大,並且如果同時有很多查詢正在進行,您可能不得不換掉 - 這會進一步降低查詢/服務器的性能。

相關問題