mysql 子查询索引_mysql select中子查询中使用强制索引的优化案例
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中子查询中使用强制索引的优化案例相关推荐
- mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...
- mysql 单表子查询语句_MySQL基本SQL查询语句:多表查询和子查询示例
一.简单查询:基本语法: 代码如下 SELECT * FROM tb_name; 查询全部 代码如下 SELECT field1,field2 FROM tb_name; 投影 代码如下 SELECT ...
- mysql 连接查询索引_Mysql (四)连接查询和索引
一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...
- mysql多表查询书籍_MySQL多表查询及子查询
1. MySQL数据库执行查询操作时的查询流程: 请求-->查询缓存 请求-->查询缓存-->解析器-->预处理器-->优化器-->查询执行引擎-->存储引擎 ...
- mysql跨库查询 索引_MySQL中跨库查询怎么搞?
导读 在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询;另一种是不同服务的跨库查询;它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 在MySQL中跨库查询主要分为两种情况,一种 ...
- mysql的基本的查询语句_Mysql的基本查询语句
聚集函数 mysql有5个聚集函数,分别是AVG,MAX,MIN,SUM,COUNT. 分组 分组的使用group by作为关键字,having作为条件关键字. having和where的区别:1.w ...
- mysql多表联合查询事例_MySQL——多表查询详细介绍以及实例
1.表与表之间的关系 一对一:用户表和身份信息表,用户表是主表 例如:男人表 .女人表create table man( mid int primary key auto_increment, mna ...
- mysql中的强制索引_你如何强制MySQL中的查询使用索引?
我试图通过向慢查询日志中出现的查询添加索引来提高锤击的wordpress DB的性能. 在MS SQL中,您可以使用查询提示强制查询使用索引,但如果正确覆盖列,则通常很容易获得查询以使用索引. 我有这 ...
- mysql数据库查询游戏_MySQL数据库高级查询和多表查询
MySQL多表查询 添加练习表 -- 用户表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id( ...
最新文章
- 编程语言趋势最新报告:开发者最青睐DevOps,Kotlin增长最快
- java下拉框选择_java中下拉框选项内容
- 【模糊数学】模糊逻辑,隶属度,模糊逻辑应用,模糊推理过程
- MyBatis:模糊查询的4种实现方式
- 指定精确度(*号的使用)
- android 微信支付测试,求大神指导一下!!!android开发,测试demo按步骤配置,无法调用到微信支付...
- 【百度地图】——利用三级联动加载百度地图
- RESTful API标准设计教程
- [转] Windows完成端口与Linux epoll技术简介
- [UWP小白日记-9]页面跳转过度动画(二)
- Java是解释型还是编译型
- android html文字垂直居中,Android EditText文本不是垂直居中的
- 《windows 鼠标指针文件 学习笔记》
- [Extjs6] 修改默认的日期月份格式
- 常见电容器图片_电容分类图片-各种电容器图片
- 电脑磁盘数据错误(循环冗余检查)的原因以及解决办法
- TikTok Shop(英国小店)常见问题:退货?结算?回款?等。
- Neo4j技能树学习之路
- Excel 撤消工作表保护密码
- visual Studio2008试用版过期升级正式版的破解方法
热门文章
- 百万CAD图纸免费送,教你轻松玩转CAD!
- strspn、strcspn、strchr、strrchr特殊字符校验
- js面试高级找出素组中三位数相加得16的多种组合
- i12蓝牙耳机充电仓怎么看充满电_HIK真无线蓝牙耳机,平价并不差
- 杨澜:一个文科生的人工智能之旅
- 直抵应用创新高地,“硬纪元”中国VRAR产业应用创新峰会成功举办
- i7 10700 和 i7 9700哪个好 i7 10700 和 i7 9700参数对比 差距有多大
- 爱奇艺直播WebAssembly优化之路
- 数据库表设计--备份记录的表设计优化
- oracle和mysql数据类型转换_oracle数据库和MySQL数据库中表格转换时的数据类型