目的在于這麼一個sql語句:
1
<code>SELECT w.* FROM wallpaper w inner join wallpaper_category_relation r ON w.wallpaper_id = r.wallpaper_id WHERE (r.category_level1_id=39 AND w.is_online = 1) ORDER BY w.online_time DESC LIMIT 0,10;</code>
這個sql語句是兩個表連查,w表和r表進行連查,w表中查詢使用到的字段有is_online, online_time, wallpaper_id, r表使用的字段有wallpaper_id, category_level1_id
兩個表都是InnoDB
其中w表的情況如下:
主鍵為wallpaper_id,沒有其他索引。
r表情況如下:
wallpaper_id不是主鍵,但是wallpaper_id+category_level1_id組成了索引。
這個查詢是個慢查詢。使用explain檢視:

可以看到其中以r表為主表,并且使用到了臨時表,這樣效率就低下了。。。
用show profiles看這個語句查詢時間:
第一個想到的是w表沒有建立任何索引,是以應該建立一個is_online和online_time的索引。
alter table wallpaper add index `isonline_onlinetime` (`is_online`, `online_time`)
現在的時間:
這裡的差別就是原先由于w表沒有用得上的索引,sql查詢優化判斷使用r表做主表。後來w加上索引後,sql查詢自動優化,判斷以w表做主表更好,就先使用上了w表的索引。
當然如果你想要強制讓查詢以w表做主表,可以使用STRAIGHT_JOIN來替換inner join。STRAIGHT_JOIN就是強制使用join前面的表作為主表,查詢的。
SELECT w.* FROM wallpaper w STRAIGHT_JOIN wallpaper_category_relation r ON w.wallpaper_id = r.wallpaper_id WHERE (r.category_level1_id=39 AND w.is_online = 1) ORDER BY w.online_time DESC LIMIT 0,10
其實這個例子很簡單,最終就加了個索引就優化了。。。主要複習了下mysql的查詢優化
本文轉自軒脈刃部落格園部落格,原文連結:http://www.cnblogs.com/yjf512/p/3166470.html,如需轉載請自行聯系原作者