目的在于这么一个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
能够看到其中以r表为主表,而且使用到了临时表,这样效率就低下了。。。索引
用show profiles看这个语句查询时间:ip
第一个想到的是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
官方文档:http://dev.mysql.com/doc/refman/5.0/en/join.html
其实这个例子很简单,最终就加了个索引就优化了。。。主要复习了下mysql的查询优化