不要随随便便的distinct和order by

有客户反应网站后台订单相关查询非常慢,通过程序拿到了相关sqlexplainexplainSELECTDISTINCT(o.orders_id),o.oa_order_id,customers_email_address,o.order_type

有客户反应网站后台订单相关查询非常慢,通过程序拿到了相关sql

explain

explain SELECT DISTINCT(o.orders_id), o.oa_order_id, customers_email_address, o.order_type, ot.text AS total_value, o.track_number, o.date_purchased, o.orders_status, o.specialOperate, o.isSpecialParent, o.pay_ip, o.supply_id, o.products_center_id, o.split_code, o.is_import, o.shipDays,o.delivery_country,o.use_coupon ,o.payment_method FROM orders AS o LEFT JOIN orders_total AS ot ON ot.orders_id=o.orders_id AND ot.class=’ot_total’ WHERE 1 AND o.is_delete = 0 AND o.date_purchased >= ‘2013-09-30 10:00:00’ AND (o.specialOperate = 0 OR o.isSpecialParent=1) ORDER BY date_purchased DESC, orders_id DESC LIMIT 0, 20;+—-+————-+——-+——-+———————————-+—————————-+———+———————-+——–+———————————————-+| id | select_type | table | type | possible_keys| key| key_len | ref| rows | Extra|+—-+————-+——-+——-+———————————-+—————————-+———+———————-+——–+———————————————-+| 1 | SIMPLE| o| range | date_purchased| date_purchased| 9| NULL| 606632 | Using where; Using temporary; Using filesort || 1 | SIMPLE| ot | ref | idx_orders_total_orders_id,class | idx_orders_total_orders_id | 4| banggood.o.orders_id |19 ||+—-+————-+——-+——-+———————————-+—————————-+———+———————-+——–+———————————————-+2 rows in set (0.05 sec)

发现索引使用正常,执行状态中发现有Copying to tmp table on disk状态,执行时间超过50s。

使用profiling发现Copying to tmp table on disk占用了大部分性能。

仔细查看该语句并和开发讨论,发现distinct和ORDER BY date_purchased DESC, orders_id DESC中,distinct关键字可以省略,而且ORDER BY date_purchased DESC, orders_id DESC可以去掉后面的orders_id desc(开发对多个字段排序不理解).

去掉后,再次explain

mysql> EXPLAIN-> SELECT o.orders_id, o.oa_order_id, customers_email_address, o.order_type, ot.text AS total_value, o.track_number, o.date_purchased, o.orders_status, o.specialOperate, o.isSpecialParent, o.pay_ip, o.supply_id, o.products_center_id, o.split_code, o.is_import, o.shipDays,o.delivery_country,o.use_coupon ,o.payment_method FROM orders AS o LEFT JOIN orders_total AS ot ON ot.orders_id=o.orders_id AND ot.class=’ot_total’ WHERE 1 AND o.is_delete = 0 AND o.date_purchased >= ‘2013-09-30 10:00:00’ AND (o.specialOperate = 0 OR o.isSpecialParent=1)-> ORDER BY date_purchased DESC LIMIT 0, 20;+—-+————-+——-+——-+———————————-+—————————-+———+———————-+——–+————-+| id | select_type | table | type | possible_keys| key| key_len | ref| rows | Extra|+—-+————-+——-+——-+———————————-+—————————-+———+———————-+——–+————-+| 1 | SIMPLE| o| range | date_purchased| date_purchased| 9| NULL| 606632 | Using where || 1 | SIMPLE| ot | ref | idx_orders_total_orders_id,class | idx_orders_total_orders_id | 4| banggood.o.orders_id |19 ||+—-+————-+——-+——-+———————————-+—————————-+———+———————-+——–+————-+2 rows in set (0.01 sec)

索引使用情况不变,但是下面的profiling,发现结果瞬间出来,执行时间不过0.003s,而且已经没有了Copying to tmp table on disk状态。

协和·太初 协和·太初

国内首个针对罕见病领域的AI大模型

协和·太初 38 查看详情 协和·太初

总结:1.因为distinct关键字需要对结果集进行去重,如果天然无重复,是不需要加上去重关键字的,上面的例子结果集有将近百万,去重字段又多,在tmp_table_size以及sort_buffer_size中排序已经不够用,所以将结果集复制到磁盘,严重影响速度

2. order by a,b 开发人员很喜欢用类似的语句,尽管对功能没有多大作用

本文出自 “原下” 博客,,请务必保留此出处

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/539951.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
怎么把eclipse打包成jar
上一篇 2025年11月9日 14:40:38
linux怎么关闭nginx
下一篇 2025年11月9日 14:40:50

相关推荐

  • 一起彻底搞懂 MySQL 的锁机制

    一起彻底搞懂 MySQL 的锁机制一起彻底搞懂 MySQL 的锁机制一起彻底搞懂 MySQL 的锁机制一起彻底搞懂 MySQL 的锁机制

                                                            锁在MySQL中是非常重要的一部分,锁对MySQL的数据访问并发有着举足轻重的影响。锁涉及到的知识篇幅也很多,所以要啃完并消化到自己的肚子里,是需要静下心好好反反复复几遍地细细品味。本文是…

    2026年9月5日 用户投稿
    100
  • mysql设置主键的两种方式

    本篇文章介绍一下mysql如何设置主键。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 主键叫做主键约束,是数据库里经常用的一种约束。为了方便查找数据,会在每个表里都添加上一个主键。 主键的约束条件: 主键的值不能为空 主键应该是明确且单一的 为了查询和处理的效率,主键一般设置在整…

    2026年9月5日
    000
  • MySQL中的人生见证

        每一种语言都有自己的注释方式,代码量越多,代码注释的重要性也就越明显。一般情况下,注释可以出现在程序中的任何位置,用来向用户或程序员提示或解释程序的功能及作用。本文主要介绍mysql中的注释。 1.字段注释 create table test1( id int primary key com…

    2026年9月5日
    100
  • mysql启动创建不了pid是什么原因

    mysql启动创建不了pid的原因:1、端口被占用;2、生成pid文件的目录mysql的权限不足;3、该mysql对应的my.cnf配置文件错误;4、mysql的启动脚本有问题;5、该mysql有残余数据影响了服务的启动。 本教程操作环境:windows7系统、mysql8.0.22版,DELL G…

    2026年9月5日
    100
  • 怎么检查看到mysql的用户名和密码

    怎么检查看到mysql的用户名和密码怎么检查看到mysql的用户名和密码怎么检查看到mysql的用户名和密码怎么检查看到mysql的用户名和密码

    查看mysql的用户名和密码的方法:首先打开Navicat并找到mysql;然后打开mysql数据库连接,单击工具栏中的【用户】选项;最后可以看到所有mysql用户和密码。 本教程操作环境:windows7系统、mysql8.0.22&&Navicat版,DELL G3电脑。 查看m…

    2026年9月5日 用户投稿
    100
  • mysql中插入表数据中文乱码怎么办

    mysql中插入表数据中文乱码怎么办mysql中插入表数据中文乱码怎么办mysql中插入表数据中文乱码怎么办mysql中插入表数据中文乱码怎么办

    mysql中插入表数据中文乱码的解决办法:1、检查本地mysql安装文件目录的默认编码方式是否是utf8;2、启动mysql服务,输入相关命令将默认数据库表的字符集编码改为utf8;3、重启服务即可。 本教程操作环境:windows7系统、mysql8.0.22版,DELL G3电脑。 mysql中…

    2026年9月5日 用户投稿
    200
  • mysql修改语句

    在mysql中可以使用【alter table 旧表名 rename 新表名;】语句修改表名,如【mysql> alter table TYPE rename type;】。 本文操作环境:windows10系统、mysql 5.7、thinkpad t480电脑。 mysql修改语句如下: …

    2026年9月5日
    000
  • 详解MySQL线程状态

    文章目录 一、show processlist二、command命令类型三、用户线程状态四、dump线程状态五、IO线程状态六、SQL 线程状态七、 主从连接线程状态 八、事件调度线程状态 相关免费学习推荐:mysql视频教程 一、show processlist 立即进入“豆包AI人工智官网入口”…

    2026年9月5日
    100
  • mysql如何修改字段类型

    mysql如何修改字段类型mysql如何修改字段类型mysql如何修改字段类型mysql如何修改字段类型

    在mysql中,可以使用“ALTER  TABLE 表名 MODIFY [COLUMN] 字段名 数据类型 类型长度  默认值  注释;”语句来修改字段类型。该语句不仅可以修改字段类型,还可以修改类型长度、默认值、注释。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 …

    2026年9月5日 用户投稿
    200
  • MySQL如何监控数据库性能_有哪些常用监控工具?

    MySQL如何监控数据库性能_有哪些常用监控工具?MySQL如何监控数据库性能_有哪些常用监控工具?MySQL如何监控数据库性能_有哪些常用监控工具?MySQL如何监控数据库性能_有哪些常用监控工具?

    mysql性能监控需关注关键指标、使用合适工具、设置告警并注意易忽略细节。一、最关键监控指标包括连接数、qps/tps、慢查询数量、innodb读写情况、锁等待与死锁;二、常用工具包括show processlist、pmm、zabbix、prometheus+grafana、pt-query-di…

    2026年9月5日 用户投稿
    000
  • 详解MySQL 联合查询 (IN和EXISTS区别)

    详解MySQL 联合查询 (IN和EXISTS区别)详解MySQL 联合查询 (IN和EXISTS区别)详解MySQL 联合查询 (IN和EXISTS区别)详解MySQL 联合查询 (IN和EXISTS区别)

    笛卡尔积 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [3] 。 假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a…

    2026年9月5日 用户投稿
    000
  • Java应用连接MySQL缓慢并报错08S01,如何排查解决?

    Java应用连接MySQL缓慢并报错08S01:问题诊断与解决方案 近期,Java应用连接MySQL数据库速度骤降,并出现“errorCode 0, state 08S01”错误,而Navicat工具却能快速连接。本文将逐步分析问题原因并提供解决方案。 一、排查步骤: 1. 网络连接测试: 立即学习…

    2026年9月5日
    200
  • 主键和唯一索引的区别的是什么

    主键和唯一索引的区别的是什么主键和唯一索引的区别的是什么主键和唯一索引的区别的是什么主键和唯一索引的区别的是什么

    区别:1、主键是一种约束,唯一索引是一种索引。2、主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。3、唯一性索引列允许空值,而主键列不允许为空值。4、主键可以被其他表引用为外键,而唯一索引不能。 本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。 主键索引和唯…

    2026年9月5日 用户投稿
    200
  • MySQL 5.7安装:my.ini中哪些参数是必不可少的?

    MySQL 5.7 my.ini文件:关键配置详解 安装MySQL 5.7时,并非所有my.ini配置项都必不可少。但以下参数对于数据库的正常运行至关重要: 核心参数: [mysql] 部分: 定义客户端连接的默认字符集,例如 default-character-set=utf8mb4 (推荐使用u…

    2026年9月5日
    200
  • 数据库SQL调优的几种方式是什么

    方式:1、创建索引时,尽量避免全表扫描;2、避免在索引上使用计算;3、尽量使用参数化SQL;4、尽量将多条SQL语句压缩到一句SQL中;5、用where字句替换HAVING字句;6、连接多个表时,使用表的别名;7、尽量避免使用游标等等。 本教程操作环境:windows7系统、mysql8版本、Del…

    2026年9月5日
    100
  • 介绍PHP + MySQL 实现数据分页显示

    一、连接数据库 $connect = mysqli_connect(‘localhost’, ‘用户名’, ‘密码’, ‘数据库名’) or die(‘数据库连接失败’);mysqli_set_charset($connect, ‘utf8’); 相关免费学习推荐:mysql视频教程 二、构建SQL…

    2026年9月5日
    100
  • 介绍MySQL复制表的几种方式

    介绍MySQL复制表的几种方式介绍MySQL复制表的几种方式介绍MySQL复制表的几种方式介绍MySQL复制表的几种方式

    复制表的几种方式 只复制表结构 create table tableName like someTable; 只复制表结构,包括主键和索引,但是不会复制表数据 只复制表数据 create table tableName select * from someTable; 复制表的大体结构及全部数据,不…

    2026年9月5日 用户投稿
    200
  • mysql版本查询命令是什么

    mysql版本查询命令是什么mysql版本查询命令是什么mysql版本查询命令是什么mysql版本查询命令是什么

    mysql版本查询命令有:1、输入“select version();”命令,按回车键,即可查看当前mysql版本;2、输入“status”命令,按回车键,即可查看当前mysql版本。 本教程操作环境:windows7系统、mysql8.0版本、Dell G3电脑。 在我们的电脑上打开mysql控制…

    2026年9月5日 用户投稿
    200
  • Servlet找不到MySQL驱动?如何解决Tomcat加载驱动问题?

    Tomcat环境下Servlet无法加载MySQL驱动程序的解决方案 在使用Servlet连接MySQL数据库时,如果遇到“找不到MySQL驱动程序”的错误,通常是因为Tomcat缺少必要的JAR包。 根据错误信息,可以推断: Servlet运行时抛出异常,提示找不到MySQL驱动类com.mysq…

    2026年9月5日
    100
  • MySQL的常用命令有哪些

    MySQL的常用命令有哪些MySQL的常用命令有哪些MySQL的常用命令有哪些MySQL的常用命令有哪些

    本篇文章给大家详细介绍mysql的常用命令。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 1. 启动与停止MySQL服务 (右键以管理员方式打开命令提示符) 输入命令:net start mysql来启动服务 输入命令:net stop mysql来关闭服务 2. MySQL登录…

    2026年9月5日 用户投稿
    200

发表回复

登录后才能评论
关注微信