码迷,mamicode.com
首页 > 数据库 > 详细

【mysql优化】语句优化

时间:2018-03-18 13:54:24      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:pos   语义   sele   ecshop   col   char   技术分享   png   post   

技术分享图片

 

 

 

1.int型子查询陷阱

: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目)

  最直观的mysql> select goods_id,cat_id,goods_name from goods where cat_id in (select cat_id from ecs_category where parent_id=6);

误区: 给我们的感觉是, 先查到内层的6号栏目的子栏目,如7,8,9,11

  然后外层, cat_id in (7,8,9,11)

 

事实: 如下图, goods表全扫描, 并逐行与category表对照,看parent_id=6是否成立

     技术分享图片

 

 

原因: mysql的查询优化器,针对In型做优化,被改成了exists的执行效果.

  当goods表越大时, 查询速度越慢.

 

 总结:in 查询不是我们想的那样,而是逐行扫描外层的数据去匹配里面,因此查询效率低下。

 

 

改进: 用连接查询来代替子查询

explain select goods_id,g.cat_id,g.goods_name from goods as g

inner join (select cat_id from ecs_category where parent_id=6) as t

using(cat_id) \G

 

 

内层 select cat_id from ecs_category where parent_id=6 ; 用到Parent_id索引, 返回4行

 

 

 

2 exists子查询

题: 查询有商品的栏目.

按上面的理解,我们用join来操作,如下:

mysql> select c.cat_id,cat_name from ecs_category as c inner join goods as g

on c.cat_id=g.cat_id group by cat_name;

 

 

 

 

3.优化规则:

优化1: 在group时, 用带有索引的列来group, 速度会稍快一些,另外,int型 比 char型 分组,也要快一些.

 

 

优化2: 在group时, 我们假设只取了A表的内容,group by 的列,尽量用A表的列,会比B表的列要快.

 

优化3: 从语义上去优化

select cat_id,cat_name from ecs_category where exists(select *from goods where goods.cat_id=ecs_category.cat_id)

 

优化4:

from 型子查询:

  注意::内层from语句查到的临时表, 是没有索引的.所以: from的返回内容要尽量少.

 

【mysql优化】语句优化

标签:pos   语义   sele   ecshop   col   char   技术分享   png   post   

原文地址:https://www.cnblogs.com/qlqwjy/p/8595168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!