mysql中min和max查询优化

本文介绍了一种通过使用ORDER BY和LIMIT来优化MySQL查询的方法,该方法显著减少了全表扫描次数,提高了查询效率。

需求: 

在一个商城(前台/后台)统计查询 需要按照 , 最低或最高(最大/最小)查询销量, 价格, 库存, 评论数... ...的时候一般需要用到mysql中min或者max函数来解决.

但是往往min()或者max()函数往往会造成全表扫描. 那么如何快速查找出自己想要的数据呢, 请看我下面做的测试:

首先来看一下表结构:

CREATE TABLE `biggoods` (
  `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cat_id` int(10) unsigned NOT NULL,
  `goods_name` varchar(32) NOT NULL,
  `click_count` int(11) NOT NULL DEFAULT '0',
  `goods_number` int(11) NOT NULL DEFAULT '0',
  `is_delete` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`goods_id`),
  KEY `goods_cat_id` (`goods_id`,`cat_id`),
  KEY `cat_goods_id` (`cat_id`,`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=34143982 DEFAULT CHARSET=utf8 |

goods表中大概有三千万行数据



普通搜索(用min()): 



用时4.45毫秒


优化后的搜索:



用时0.00毫米


explain分析结果:

普通语句:


优化后的sql语句:



结尾:

通过explain清楚的看到普通sql语句和优化后的sql语句都进行了index索引扫描, 但是优化后的sql语句在explain中的rows字段中显示只扫描了1行数据, 而普通语句确扫描了2012行数据. 这一切的缘由就是因为在查询中,优化后的语句用order by进行排序(索引是自带排序功能的)后limit 1, 使其仅仅进行了1行数据的扫描
Oracle MySQL 的 `MIN` `MAX` 函数在基本功能上是相同的,它们都用于查找某一列中的最小值最大值。然而,在一些细节使用场景上,两者存在一些差别: ### 1. **基本用法(相似)** - Oracle MySQL 都支持对列使用 `MIN` `MAX` 函数。 - 示例: ```sql SELECT MIN(salary) FROM employees; SELECT MAX(salary) FROM employees; ``` ### 2. **字符串支持** - **Oracle**:支持对字符串类型使用 `MIN` `MAX`,会按照字符的字典顺序(ASCII 值)进行比较。 - **MySQL**:同样支持对字符串使用 `MIN` `MAX`,比较规则与 Oracle 类似,但可能受字符集排序规则(collation)影响。 ### 3. **日期类型支持** - **Oracle**:支持对日期类型使用 `MIN` `MAX`,并返回最早或最晚的日期。 - **MySQL**:也支持对日期类型使用 `MIN` `MAX`,用法与 Oracle 类似。 ### 4. **性能差异** - **Oracle**:在处理大型数据集时,通常性能更优,因为它有更复杂的优化器。 - **MySQL**:在小型或中型数据集上表现良好,但在某些复杂查询中性能可能不如 Oracle。 ### 5. **语法细节** - **Oracle**: - 使用 `DUAL` 表作为虚拟表进行函数测试。 - 示例: ```sql SELECT MIN('A', 'B') FROM DUAL; ``` - **MySQL**: - 不需要 `DUAL` 表,可以直接使用表达式。 - 示例: ```sql SELECT MIN('A', 'B'); ``` ### 6. **多参数支持** - **Oracle**:`MIN` `MAX` 函数不支持直接传入多个参数,需要使用 `LEAST` 或 `GREATEST` 来实现。 - 示例: ```sql SELECT LEAST('A', 'B') FROM DUAL; SELECT GREATEST('A', 'B') FROM DUAL; ``` - **MySQL**:`MIN` `MAX` 可以直接传入多个参数。 - 示例: ```sql SELECT MIN('A', 'B'); SELECT MAX('A', 'B'); ``` ### 7. **NULL 值处理** - **Oracle** **MySQL**:都忽略 `NULL` 值,仅对非空值进行计算。 ### 总结 | 特性 | Oracle | MySQL | |------------------|----------------------------------|----------------------------------| | 基本功能 | 支持 `MIN` `MAX` | 支持 `MIN` `MAX` | | 字符串支持 | 支持,按字典顺序 | 支持,受字符集排序规则影响 | | 日期支持 | 支持 | 支持 | | 多参数支持 | 不支持,需使用 `LEAST`/`GREATEST`| 支持直接传入多个参数 | | 虚拟表 | 需要 `DUAL` 表 | 不需要 `DUAL` 表 | 如果需要在 Oracle 中实现类似 MySQL 的多参数 `MIN`/`MAX` 功能,可以使用 `LEAST` `GREATEST` 函数。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值