博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql的优化一则
阅读量:6542 次
发布时间:2019-06-24

本文共 1108 字,大约阅读时间需要 3 分钟。

目的在于这么一个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查看:

可以看到其中以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表的索引。

可以使用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的查询优化

转载地址:http://stodo.baihongyu.com/

你可能感兴趣的文章
Hibernate学习系列————注解一对多双向实例
查看>>
Cannot load from mysql.proc
查看>>
网络运维之 EX4200消除var分区使用过高的告警
查看>>
【最好的流程是没有流程】
查看>>
Apache Thrift 教程
查看>>
Python Epoll
查看>>
AS3歌词同步详解
查看>>
单例模式
查看>>
Linux环境NetBeans字体通用抗据齿解决方法
查看>>
Eclipse的花括号(brace)的输入偏好问题
查看>>
Android开发 获取当前activity的屏幕截图
查看>>
工作记录
查看>>
python之重写父类方法
查看>>
cucumber-api安装与试用
查看>>
C#屏幕截图
查看>>
C#使用Tesseract OCR 解析验证码
查看>>
计算硬件简史
查看>>
医生工作台1期
查看>>
JS-两周内自动登录功能
查看>>
jQuery自适应倒计时插件
查看>>