mysql中select求最大值_关于取表中id最大值+1的select语句,哪种效率更高?

需求:取stock表中id最大值+1,作为下一个id值。

特殊情况:考虑到表中会没有值,max(id)会返回空,因此需要用case when进行判断。

实现一:select (case max(id) is null when true then 0 else max(id)+1 end) from stock

实现二:select (case (select count(*) from stock) when 0 then 0 else max(id)+1 end) from stock

效率分析:

实现一相对于实现二不取数量,在索引的帮助下也能快速取值,因此效率应该比实现二高。

分析之验证:

(MySQL数据库)

stock表中没有数据时:

mysql> explain select (case max(id) is null when true then 0 else max(id)+1 end) fromstock;+----+-------------+-------+------+---------------+------+---------+------+------+-------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+------+-------------------------+

| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No matching min/max row |

+----+-------------+-------+------+---------------+------+---------+------+------+-------------------------+

1 row in set (0.00sec)

mysql> explain select (case (select count(*) from stock) when 0 then 0 else max(id)+1 end) fromstock;+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------------------+

| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No matching min/max row |

| 2 | SUBQUERY | stock | index | NULL | PRIMARY | 4 | NULL | 3749 | Using index |

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------------------+

2 rows in set (0.05 sec)

stock表中有数据时:

mysql> select count(*) fromstock;+----------+

| count(*) |

+----------+

| 3768 |

+----------+

1 row in set (0.00sec)

mysql> explain select (case max(id) is null when true then 0 else max(id)+1 end) fromstock;+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+

| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |

+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+

1 row in set (0.00sec)

mysql> desc select (case (select count(*) from stock) when 0 then 0 else max(id)+1 end) fromstock;+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+

| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |

| 2 | SUBQUERY | stock | index | NULL | PRIMARY | 4 | NULL | 3696 | Using index |

+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+

2 rows in set (0.00 sec)

分析之验证:

oracle数据库

MySQL版的SQL不能直接在oracle里使用,因此需要改写成:

方案一:select nvl(max(id)+1,0) from stock;

方案二:select (case count(*) when 0 then 0 else max(id)+1 end) from stock

然后我模拟做了3744条记录,跑解释计划确实方案二慢.

方案一的执行计划:

SQL> select nvl(max(id)+1,0) fromstock;

已用时间:00: 00: 00.00执行计划----------------------------------------------------------

Plan hash value: 1547204082

-------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|Time|

-------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)|

00:00:01 |

| 1 | SORT AGGREGATE | | 1 | 13 | |

|

| 2 | INDEX FULL SCAN (MIN/MAX)| SYS_C0011050 | 1 | 13 | 2 (0)|

00:00:01 |

-------------------------------------------------------------------------------------------

Note-----

- dynamic sampling used for this statement (level=2)

方案二的执行计划:

SQL> select (case count(*) when 0 then 0 else max(id)+1 end) fromstock;

已用时间:00: 00: 00.00执行计划----------------------------------------------------------

Plan hash value: 916654

--------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|Time|

--------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 13 | 5 (0)| 00:0

0:01 |

| 1 | SORT AGGREGATE | | 1 | 13 | |

|

| 2 | INDEX FAST FULL SCAN| SYS_C0011050 | 3744 | 48672 | 5 (0)| 00:0

0:01 |

--------------------------------------------------------------------------------------

Note-----

- dynamic sampling used for this statement (level=2)

--2020年5月2日--

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 SQL 语句来获取 MySQL 数据库一列的最大值。例如,假设您有一个名为 `mytable` 的表,其有一个名为 `score` 的列,您可以使用以下 SQL 语句来获取该列的最大值: ``` SELECT MAX(score) FROM mytable; ``` 在 Java ,您可以使用 JDBC(Java Database Connectivity)与 MySQL 数据库进行交互。以下是使用 JDBC 获取 MySQL 数据库一列的最大值的示例代码: ```java import java.sql.*; public class MaxValue { public static void main(String[] args) { try { // 加载 MySQL JDBC 驱动程序 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "mypassword"; Connection connection = DriverManager.getConnection(url, username, password); // 创建 SQL 语句 String sql = "SELECT MAX(score) FROM mytable"; // 创建 Statement 对象 Statement statement = connection.createStatement(); // 执行查询 ResultSet resultSet = statement.executeQuery(sql); // 处理结果集 if (resultSet.next()) { int maxValue = resultSet.getInt(1); System.out.println("The maximum value is: " + maxValue); } // 关闭连接 resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 该代码使用 `com.mysql.jdbc.Driver` 驱动程序连接到本地 MySQL 数据库的 `mydatabase` 数据库。它创建一个 SQL 语句,然后使用 `Statement` 对象执行该查询。最后,它处理结果集并打印出最大值

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值