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

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

总结下:

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

Mysql的优化一则的更多相关文章

  1. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  2. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  3. Mysql性能优化一

    下一篇:Mysql性能优化二 mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包 ...

  4. 关于MySQL数据库优化的部分整理

    在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...

  5. [MySQL性能优化系列]提高缓存命中率

    1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...

  6. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  7. 【MySQL】花10分钟阅读下MySQL数据库优化总结

    1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...

  8. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  9. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  10. mysql 性能优化方向

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

随机推荐

  1. 如何悄悄地提升MySQL用户权限

    温馨提示: 一次成功的非法提权,需要的必备条件是:1.对mysql权限表的查.改权限: 2.一次不经意的数据库服务器重启: 此次测试版本:5.6.25 准备邪恶用户: grant update on ...

  2. Ubuntu 默认启动到命令行 12.04

    源文链接:http://my.oschina.net/jackguo/blog/85706 代码: sudo gedit /etc/default/grub 引用: GRUB_CMDLINE_LINU ...

  3. 快速创建一个 spring mvc 示例

    1. 创建一个 servlet 项目 参考 http://www.cnblogs.com/zno2/p/5908589.html 2. 引入 spring mvc 依赖 <dependency& ...

  4. day2(基础数据类型)

    一.基础数据类型操作 1.数字 int 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以: int.bit_length() -> int Number of bits necess ...

  5. Redis模块开发示例

    实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作: 2) incrby同时设置一个key的过期时间 在没有module之前,需要借助eval ...

  6. (转)EntityFramework.Extensions

    转自:http://www.symbolsource.org/Public/Metadata/NuGet/Project/EntityFramework.Extended/1.0.0.20/Relea ...

  7. webService之helloword(java)rs

    webservice之rs(helloworld) 1.pom.xml文件 <dependencies> <!-- 使用CXF RS开发 --> <dependency& ...

  8. Jack Straws(poj 1127) 两直线是否相交模板

    http://poj.org/problem?id=1127   Description In the game of Jack Straws, a number of plastic or wood ...

  9. KVM学习(初步安装与使用)

    本机环境介绍 本次使用Vmware workstation 12 pro版本号为12.5.2 build-4638234.虚拟机操作系统版本如下 [root@node2 ~]# cat /etc/re ...

  10. Android多线程操作sqlite(Sqlite解决database locked问题)(2)使用事务处理的效果

    问题场景描述: 在页面中用到了ViewPager控件,ViewPager中的内容分别是两个ListView,两个ListView的数据都来自本地数据库(先从网络下载数据,然后更新本地数据库),在实际的 ...