mysql group by 性能_记一次Mysql group by的优化
直接上干货:
数据量: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的优化相关推荐
- mysql connection是什么_记一次MySQL出现too many connection
今天中午的时候突然接到报警,MySQL连接数暴增..本来设置的max_conntion=6000, 这个数值连接已经够用.接到报警速度连接服务器连接mysql总是报如下错误: [mysql@local ...
- mysql native数据同步_记一次MySQL(5.7版本)数据库的主从同步和备份
我遇到的问题 我先后在BAT三大云服务器商购买了学生机,配置如下百度云2核/4G 阿里云1核/2G 腾讯云1核/2G 我的解决方案 由于我不知道百度云的续费规则,导致买了2核/4G的服务器之后以为像阿 ...
- mysql查看脚本错误位置_记一次mysql启动不了查找经历
在linux上用的是xampp,mysql启动没有报任何错误,但就是查找不到进程,于是找mysql错误日志,日志在哪?在lampp/var/mysql 以.err结尾的文件里.里面内容如下; /opt ...
- mysql 安装只有一半_记一次MySQL安装出现的坑爹问题。。。
关键词:mysql安装msvcr100.dll缺失 vc++2010 : win10系统首次安装mysql,图方便下载了图形界面的安装包(5.6.4),本以为小事一桩:装一半失败.卸载清注册表.重装 ...
- mysql无法启动修复_记一次MySQL无法启动及修复经历
记得有次本地的MySQL无法启动,网上说,去删掉InnoDB日志就行,我就傻乎乎的去删掉了InnoDB相关的文件,果然,没有任何问题,正常启动了. 可是谁曾想,过了几天,故障复现了,我就按部就班的又去 ...
- 阿里云下mysql远程访问被拒绝_记一次MySQL数据库拒绝访问的解决过程
最近在折腾wordpress博客,连接MySQL数据库时提示拒绝访问.经过排查,解决了问题.这里记录下解决问题的方案,以及解决的思路.如有遇到类似问题的读者可以参考下. 用wordpress搭博客,数 ...
- 修改mysql 视图字段类型_记一次mysql视图创建时自定义字段类型不同环境不同的原因...
由于老项目使用的是hibernate,当项目启动时会去检查数据库字段类型等,发现一张视图中某个自定义字段在开发环境中类型为text,但是到了生产环境类型却为mediumtext,导致代码在生产上会有问 ...
- mysql update不更新_记一次MySQL更新语句update的踩坑
背景 最近在一次线上作业过程中执行了一句DML语句,本以为万无一失,结果应用反馈说没有更新,数据还是没有变,最后经过排查才发现是我语句写错了,导致update语句执行的结果与预期不符. 情景再现 为了 ...
- mysql 二十条记录_记 MySQL优化 20条
大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查 ...
最新文章
- shell脚本替换文件中字符
- 关于RelativeLayout设置垂直居中对齐不起作用的问题
- vscode 好用插件
- C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中)
- java枚举类使用 == 还是equals来进行比较
- 微信小程序小模块界面,边框带阴影
- 微信获取token服务器处理,微信硬件平台(九) 自己的服务器从微信获取token并保存txt...
- 流量劫持能有多大危害?
- 2021高校毕业礼物,竞争太激烈了!
- keil5c语言定义引脚,keil编写C程序是不是不能在函数内定义变量啊,求大神
- 18张图,揭开阿里巴巴开发手册强制使用SLF4J作为门面担当的秘密
- VueJs探索之watch用法详解
- linux awk判断字符串开头,Linux文件比较三剑客(awk/grep/sed)之awk
- VirtualBox报错:不能为虚拟电脑XXX打开一个新任务
- 洛谷 #2197. Nim游戏
- k8s跑一个nginx-app体验
- 服务器系统如用pe和做镜像,微软WDS网络启动PE做系统的服务器配置和PE修改教程...
- 关于android的webview打开淘宝天猫链接问题
- UART通信协议学习笔记
- hadoop 权威指南 HBase