zoukankan      html  css  js  c++  java
  • 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查看:

    Image

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

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

    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的查询优化

  • 相关阅读:
    2190 ACM 数学概率论的乘法和加法原则
    2186 ACM 水题 int 向下取整
    2110 ACM Crisis of HDU 母函数
    2079 ACM 选课时间 背包 或 母函数
    2111 ACM 贪心 水题
    2108 ACM 向量积 凹凸
    My Web Developer Roadmap
    2109 ACM 排序
    2107 ACM 水题
    vi的常用命令
  • 原文地址:https://www.cnblogs.com/yjf512/p/3166470.html
Copyright © 2011-2022 走看看