1,朋友找我帮忙看下比较慢的sql语句

SELECT

pg.product_goods_id,

pg.product_id,

pg.pdt_code,

pg.pdt_name,

pg.brand_name,

pg.reference_price,

pg.deposit,

pg.sale_status,

pg.is_delete,

pg.create_date,

pg.create_operator,

pg.update_date,

pg.update_operator,

si.shop_id,

si.shop_name,

pg.goods_img_url,

pg.is_bargain,

pg.qr_code_url,

(

SELECT

COUNT(*)

FROM

product_attention pa

WHERE

pa.product_goods_id = pg.product_goods_id

AND `status` = 0

) AS laud,

pc.category_name,

pg.is_experience,

pg.deposit,

pg.buy_type,

pg.content,

pg.assure_flag,

pg.market_price,

pg.qty_cnt,

pg.sales_cnt

FROM

product_goods pg

LEFT JOIN shop_info si ON si.shop_id = pg.shop_id

LEFT JOIN product_category pc ON pc.category_id = pg.category_id

WHERE

si.market_id IN (1, 2, 3, 12, 13)

ORDER BY pg.update_date DESC , pg.product_goods_id DESC

LIMIT 0,

20;

问题1,加上如下的子查询,比较慢

(

SELECT

COUNT(*)

FROM

product_attention pa

WHERE

pa.product_goods_id = pg.product_goods_id

AND `status` = 0

) AS laud,

这里加上去就有点慢,有什么优化办法么,询问有啥方法?

2,我让他提供了explain分析下执行结果

C:\Users\Administrator\Pictures\1105\e1.jpg

从中可以看到,pg表中用到了临时表空间也用到了filesort,这个点比较麻烦了。

3,我让他提供下涉及到的几个表的索引情况

、pa.jpg

、si.jpg

、pg.jpg

几个表的数据量都不大,product_goods 6w多条,其他3千多条。不应该这么慢的。

4,去掉order by后比较快的思考

我猜猜可能是order by引起的,我让去掉order by之后,他说比较快,但是这个order by不能轻易去掉,因为这是也许需要。但是order by字段里面有 product_goods_id。

5,解决方案:强制使用主键索引

分析到引起蛮的order by以及子查询里面都有product_goods_id字段,而且这个字段是pg表的主键,这么可以强制使用主键索引而不走shop_id的索引,我让他采用product_goods pg force index(PRI) 强制使用主键索引,我这样想,主要是因为这个语句的子查询用的是主键关联,但是explain的时候用的是shop_id的索引,我就怀疑是走了这个shop_id的索引导致的。如果不走这个shop_id字段的索引,直接走主键id既然兼顾到了join表链接又兼顾到了子查询了。

结果,他测试了后,发现快了许多,问题解决,expain结果如下ok.jpg所示,已经没有using temporary这一项了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 11-04

mysql 子查询索引_mysql select中子查询中使用强制索引的优化案例相关推荐

  1. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  2. mysql 单表子查询语句_MySQL基本SQL查询语句:多表查询和子查询示例

    一.简单查询:基本语法: 代码如下 SELECT * FROM tb_name; 查询全部 代码如下 SELECT field1,field2 FROM tb_name; 投影 代码如下 SELECT ...

  3. mysql 连接查询索引_Mysql (四)连接查询和索引

    一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...

  4. mysql多表查询书籍_MySQL多表查询及子查询

    1. MySQL数据库执行查询操作时的查询流程: 请求-->查询缓存 请求-->查询缓存-->解析器-->预处理器-->优化器-->查询执行引擎-->存储引擎 ...

  5. mysql跨库查询 索引_MySQL中跨库查询怎么搞?

    导读 在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询;另一种是不同服务的跨库查询;它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 在MySQL中跨库查询主要分为两种情况,一种 ...

  6. mysql的基本的查询语句_Mysql的基本查询语句

    聚集函数 mysql有5个聚集函数,分别是AVG,MAX,MIN,SUM,COUNT. 分组 分组的使用group by作为关键字,having作为条件关键字. having和where的区别:1.w ...

  7. mysql多表联合查询事例_MySQL——多表查询详细介绍以及实例

    1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表create table man( mid int primary key auto_increment, mna ...

  8. mysql中的强制索引_你如何强制MySQL中的查询使用索引?

    我试图通过向慢查询日志中出现的查询添加索引来提高锤击的wordpress DB的性能. 在MS SQL中,您可以使用查询提示强制查询使用索引,但如果正确覆盖列,则通常很容易获得查询以使用索引. 我有这 ...

  9. mysql数据库查询游戏_MySQL数据库高级查询和多表查询

    MySQL多表查询 添加练习表 -- 用户表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id( ...

最新文章

  1. 编程语言趋势最新报告:开发者最青睐DevOps,Kotlin增长最快
  2. java下拉框选择_java中下拉框选项内容
  3. 【模糊数学】模糊逻辑,隶属度,模糊逻辑应用,模糊推理过程
  4. MyBatis:模糊查询的4种实现方式
  5. 指定精确度(*号的使用)
  6. android 微信支付测试,求大神指导一下!!!android开发,测试demo按步骤配置,无法调用到微信支付...
  7. 【百度地图】——利用三级联动加载百度地图
  8. RESTful API标准设计教程
  9. [转] Windows完成端口与Linux epoll技术简介
  10. [UWP小白日记-9]页面跳转过度动画(二)
  11. Java是解释型还是编译型
  12. android html文字垂直居中,Android EditText文本不是垂直居中的
  13. 《windows 鼠标指针文件 学习笔记》
  14. [Extjs6] 修改默认的日期月份格式
  15. 常见电容器图片_电容分类图片-各种电容器图片
  16. 电脑磁盘数据错误(循环冗余检查)的原因以及解决办法
  17. TikTok Shop(英国小店)常见问题:退货?结算?回款?等。
  18. Neo4j技能树学习之路
  19. Excel 撤消工作表保护密码
  20. visual Studio2008试用版过期升级正式版的破解方法

热门文章

  1. 百万CAD图纸免费送,教你轻松玩转CAD!
  2. strspn、strcspn、strchr、strrchr特殊字符校验
  3. js面试高级找出素组中三位数相加得16的多种组合
  4. i12蓝牙耳机充电仓怎么看充满电_HIK真无线蓝牙耳机,平价并不差
  5. 杨澜:一个文科生的人工智能之旅
  6. 直抵应用创新高地,“硬纪元”中国VRAR产业应用创新峰会成功举办
  7. i7 10700 和 i7 9700哪个好 i7 10700 和 i7 9700参数对比 差距有多大
  8. 爱奇艺直播WebAssembly优化之路
  9. 数据库表设计--备份记录的表设计优化
  10. oracle和mysql数据类型转换_oracle数据库和MySQL数据库中表格转换时的数据类型