mysql level =1_Mysql的优化一则

目的在于这么一个sql语句: 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_id

两个表都是InnoDB

其中w表的情况如下:

主键为wallpaper_id,没有其他索引。

r表情况如下:

wallpaper_id不是主键,但是wallpaper_id+category_level1_id组成了索引。

使用优化

这个查询是个慢查询。使用explain查看:

0fae2c249befbd5b518199c933a73d5d.png

可以看到其中以r表为主表,并且使用到了临时表,这样效率就低下了。。。

用show profiles看这个语句查询时间:

e00e0d2ecd7249ebda1791f293799a34.png

第一个想到的是w表没有建立任何索引,所以应该建立一个is_online和online_time的索引。

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

bd27f743785f174dd017f09052c349bc.png

现在的时间:

cff743048ca582d027b1550abc5e5176.png

这里的区别就是原先由于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

总结下:

其实这个例子很简单,最终就加了个索引就优化了。。。主要复习了下mysql的查询优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值