但數據表上在username,的確是有索引的。怎么會反而要Using filesort? 看了一下數據表定義。是一個開源聊天服務器ejabberd的一張表。初看以為主鍵i_rosteru_user_jid是username,和jid的聯合索引,那么使用order by username時應該是可以使用到索引才對呀?
發現了這個問題后,我們開始懷疑慢查詢和這個索引有關,前綴索引的主要用途在于有時字段過程,而MySQL支持的很多索引長度是有限制的。 首先不帶order by 的limit 這種查詢,本質可能還是和主鍵相關的,因為MySQL 的INNODB的操作實際都是依靠主鍵的(即使你沒有建立,系統也會有一個默認的),而limit這種查詢,使用主鍵是可以加快速度,(explain返回的rows 應該是一個參考值),雖然我沒有看見什么文檔明確的說明過這個問題,但從不帶order by 的limit 查詢的返回結果基本可以證明這點。
但當我們使用order by username的時候,由于希望使用的是username的排序,而不是username(75)的排序,但實際索引是前綴索引,不是完整字段的索引。所以反而導致了order by的時候完全無法利用索引了。(我在SQL語句里面增加強制使用索引i_rosteru_user_jid也不起作用)。而其實使用中,表中的字段username 連75個都用不到,何況定義的250的長度。完全是自己折騰導致的麻煩。由于這是其他產品的表格,我們無法更改,暫時只能先將就用不不帶排序的查詢講究。
總結: •前綴索引,并不是一個萬能藥,他的確可以幫助我們對一個寫過長的字段上建立索引。但也會導致排序(order by ,group by)查詢上都是無法使用前綴索引的。 •任何時候,對于DB Schema定義,合理的規劃自己的字段長度,字段類型都是首要的事情。