Mysql的優化一則

目的在於這麼一個sql語句:php

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;

這個sql語句是兩個表連查,w表和r表進行連查,w表中查詢使用到的字段有is_online, online_time, wallpaper_id, r表使用的字段有wallpaper_id, category_level1_idhtml

兩個表都是InnoDBmysql

其中w表的狀況以下:sql

主鍵爲wallpaper_id,沒有其餘索引。優化

r表狀況以下:3d

wallpaper_id不是主鍵,可是wallpaper_id+category_level1_id組成了索引。htm

使用優化

這個查詢是個慢查詢。使用explain查看:blog

Image

能夠看到其中以r表爲主表,而且使用到了臨時表,這樣效率就低下了。。。索引

用show profiles看這個語句查詢時間:ip

Image(1)

第一個想到的是w表沒有創建任何索引,因此應該創建一個is_online和online_time的索引。

alter table wallpaper add index `isonline_onlinetime` (`is_online`, `online_time`)

Image(2)

如今的時間:

Image(3)

這裏的區別就是原先因爲w表沒有用得上的索引,sql查詢優化判斷使用r表作主表。後來w加上索引後,sql查詢自動優化,判斷以w表作主表更好,就先使用上了w表的索引。

能夠使用STRAIGHT_JOIN

固然若是你想要強制讓查詢以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

官方文檔:http://dev.mysql.com/doc/refman/5.0/en/join.html

總結下:

其實這個例子很簡單,最終就加了個索引就優化了。。。主要複習了下mysql的查詢優化

相關文章
相關標籤/搜索