直接上干货:

数据量:50万

mysql版本:5.6.26

表结构:

CREATE TABLE bet_order_product (

bet_order_product_id varchar(40) NOT NULL COMMENT '订单与商品关联id',

bet_order_product_order_id varchar(40) DEFAULT NULL COMMENT '订单主键id',

bet_order_product_order_number varchar(40) DEFAULT NULL COMMENT '订单号',

bet_order_product_product_id varchar(40) DEFAULT NULL COMMENT '商品主键id',

bet_order_product_product_name varchar(40) DEFAULT NULL COMMENT '商品名',

bet_order_product_product_type_id varchar(40) DEFAULT NULL COMMENT '商品类型外键',

bet_order_product_product_count varchar(10) DEFAULT NULL COMMENT '商品数量',

bet_order_product_product_unit_name varchar(20) DEFAULT NULL COMMENT '商品单位名',

bet_order_product_create_time varchar(20) DEFAULT NULL COMMENT '订单与商品关联创建时间',

bet_order_product_update_time timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '订单与商品关联更新时间',

bet_order_product_product_former_price decimal(20,2) DEFAULT NULL COMMENT '商品原标价',

bet_order_product_product_sale_price decimal(20,2) DEFAULT NULL COMMENT '商品时间成交价',

bet_order_product_product_total decimal(20,2) DEFAULT NULL COMMENT '本次订单商品的总价',

bet_order_product_univalent_remark varchar(255) DEFAULT NULL COMMENT '商品单价修改备注',

bet_order_product_del_flag int(2) DEFAULT '1' COMMENT '订单与商品关联删除标记,1、未删除,2、已删除',

bet_order_product_product_bid_price decimal(20,2) DEFAULT '0.00' COMMENT '商品的进价',

PRIMARY KEY (bet_order_product_id),

KEY 商品外键 (bet_order_product_product_id) USING BTREE,

KEY 订单号 (bet_order_product_order_number) USING BTREE,

KEY 订单外键 (bet_order_product_order_id) USING BTREE,

KEY 商品名 (bet_order_product_product_name) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单与商品多对多关联中间表';

原始sql (查询时间:约81s):

select

bet_order_product_order_number,

bet_order_product_product_id,

bet_order_product_product_former_price,

bet_order_product_product_name,

bet_order_product_product_unit_name

from bet_order_product

where bet_order_product_order_number in (123192648142,122219077460,122176172325)

and bet_order_product_del_flag = 1

group by bet_order_product_product_id

优化后sql (约3s):

select

bet_order_product_order_number,

bet_order_product_product_id,

bet_order_product_product_former_price,

bet_order_product_product_name,

bet_order_product_product_unit_name

from (

select

bet_order_product_order_number,

bet_order_product_product_id,

bet_order_product_product_former_price,

bet_order_product_product_name,

bet_order_product_product_unit_name

from bet_order_product

where bet_order_product_order_number in (123192648142,122219077460,122176172325)

and bet_order_product_del_flag = 1

)t

group by bet_order_product_product_id

优化原理:

在分组查询之前先查出数据放在临时表里面,然后在临时表里面去进行数据的分组。

分析:

只查询不分组(时间约3s):

select

bet_order_product_order_number,

bet_order_product_product_id,

bet_order_product_product_former_price,

bet_order_product_product_name,

bet_order_product_product_unit_name

from bet_order_product

where bet_order_product_order_number in (123192648142,122219077460,122176172325)

and bet_order_product_del_flag = 1

查询再分组,执行时间一下就标到了81s左右。

由此得出:问题一定是出在分组(group by)上面。

在网上查阅资料后得出一下结论:

group by:会进行全表的扫描,然后出结果,无论你前面的条件是如何的,它都会去全表扫描一次。

所以:现在直接先查出数据,放在临时表里面,然后再用分组语句去查临时表,这样就能把group by的扫描范围缩小到一定的数据量,而不用再去50万的数据里面去扫描。

优化之路且漫长,祝大家一路顺风。忠告:多去看下官方文档,网上好多资料都是不准确的,坑太多。

BIllZhang

mysql group by 性能_记一次Mysql group by的优化相关推荐

  1. mysql connection是什么_记一次MySQL出现too many connection

    今天中午的时候突然接到报警,MySQL连接数暴增..本来设置的max_conntion=6000, 这个数值连接已经够用.接到报警速度连接服务器连接mysql总是报如下错误: [mysql@local ...

  2. mysql native数据同步_记一次MySQL(5.7版本)数据库的主从同步和备份

    我遇到的问题 我先后在BAT三大云服务器商购买了学生机,配置如下百度云2核/4G 阿里云1核/2G 腾讯云1核/2G 我的解决方案 由于我不知道百度云的续费规则,导致买了2核/4G的服务器之后以为像阿 ...

  3. mysql查看脚本错误位置_记一次mysql启动不了查找经历

    在linux上用的是xampp,mysql启动没有报任何错误,但就是查找不到进程,于是找mysql错误日志,日志在哪?在lampp/var/mysql 以.err结尾的文件里.里面内容如下; /opt ...

  4. mysql 安装只有一半_记一次MySQL安装出现的坑爹问题。。。

    关键词:mysql安装msvcr100.dll缺失  vc++2010 : win10系统首次安装mysql,图方便下载了图形界面的安装包(5.6.4),本以为小事一桩:装一半失败.卸载清注册表.重装 ...

  5. mysql无法启动修复_记一次MySQL无法启动及修复经历

    记得有次本地的MySQL无法启动,网上说,去删掉InnoDB日志就行,我就傻乎乎的去删掉了InnoDB相关的文件,果然,没有任何问题,正常启动了. 可是谁曾想,过了几天,故障复现了,我就按部就班的又去 ...

  6. 阿里云下mysql远程访问被拒绝_记一次MySQL数据库拒绝访问的解决过程

    最近在折腾wordpress博客,连接MySQL数据库时提示拒绝访问.经过排查,解决了问题.这里记录下解决问题的方案,以及解决的思路.如有遇到类似问题的读者可以参考下. 用wordpress搭博客,数 ...

  7. 修改mysql 视图字段类型_记一次mysql视图创建时自定义字段类型不同环境不同的原因...

    由于老项目使用的是hibernate,当项目启动时会去检查数据库字段类型等,发现一张视图中某个自定义字段在开发环境中类型为text,但是到了生产环境类型却为mediumtext,导致代码在生产上会有问 ...

  8. mysql update不更新_记一次MySQL更新语句update的踩坑

    背景 最近在一次线上作业过程中执行了一句DML语句,本以为万无一失,结果应用反馈说没有更新,数据还是没有变,最后经过排查才发现是我语句写错了,导致update语句执行的结果与预期不符. 情景再现 为了 ...

  9. mysql 二十条记录_记 MySQL优化 20条

    大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查 ...

最新文章

  1. shell脚本替换文件中字符
  2. 关于RelativeLayout设置垂直居中对齐不起作用的问题
  3. vscode 好用插件
  4. C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中)
  5. java枚举类使用 == 还是equals来进行比较
  6. 微信小程序小模块界面,边框带阴影
  7. 微信获取token服务器处理,微信硬件平台(九) 自己的服务器从微信获取token并保存txt...
  8. 流量劫持能有多大危害?
  9. 2021高校毕业礼物,竞争太激烈了!
  10. keil5c语言定义引脚,keil编写C程序是不是不能在函数内定义变量啊,求大神
  11. 18张图,揭开阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密
  12. VueJs探索之watch用法详解
  13. linux awk判断字符串开头,Linux文件比较三剑客(awk/grep/sed)之awk
  14. VirtualBox报错:不能为虚拟电脑XXX打开一个新任务
  15. 洛谷 #2197. Nim游戏
  16. k8s跑一个nginx-app体验
  17. 服务器系统如用pe和做镜像,微软WDS网络启动PE做系统的服务器配置和PE修改教程...
  18. 关于android的webview打开淘宝天猫链接问题
  19. UART通信协议学习笔记
  20. hadoop 权威指南 HBase

热门文章

  1. 一文了解27市5G建设最新进展与规划
  2. 2014 junior T1 珠心算测试 题解
  3. 手写简化版数据库--MYDB
  4. 手写mybatis完整sql插件
  5. Python学习笔记-Pygame
  6. 《C语言编程魔法书:基于C11标准》——2.6 大端与小端
  7. 【接口时序】QSPI Flash的原理与QSPI时序的Verilog实现
  8. 暴风影音去除暂停时的广告
  9. CSP-J 2021
  10. 基于.net6.0在wpf桌面应用中发布webApi服务示例